#include<bits/stdc++.h>
#define mp make_pair
using namespace std;

template<typename _T>
inline _T read(){
	_T res=0;
	char c=getchar();
	while(!isdigit(c)){
		c=getchar();
	}
	while(isdigit(c)){
		res=(res<<1)+(res<<3)+(c^48);
		c=getchar();
	}
	return res;
}

const int mod=1e9+7;
using pii = pair<int,int>; 
int C,T;
int n;
int k;
vector<int>e[100005];
pii edge[100005];
vector<int>edg;
int deg[100005];
int fac[100005];
int inv[100005];

int ksm(int x,int p){
	int res=1;
	while(p){
		if(p&1){
			res=1ll*x*res%mod;
		}
		x=1ll*x*x%mod;
		p>>=1;
	}
	return res;
}

namespace subtask1{
	// task 1 to 6
	
	void solve(){
		n=read<int>();
		k=read<int>();
		fac[0]=1;
		for(int i=1;i<=n;i++){
			fac[i]=1ll*fac[i-1]*i%mod;
		}
		for(int i=1;i<=n;i++){
			deg[i]=0;
		}
		for(int i=1;i<n;i++){
			int u=read<int>();
			int v=read<int>();
			deg[u]++;
			deg[v]++;
		}
		edg.resize(k);
		for(auto &i:edg){
			i=read<int>();
		}
		int res=1;
		for(int i=1;i<=n;i++){
			res=1ll*res*fac[deg[i]-1]%mod;
		}
		printf("%d\n",res);
	}
}

namespace subtask2{
	//task 7 to 10
	
	int res=1;
	int res1;
	
	int tmpu,tmpv;
	
	void dfs(int p,int f){
		if(p==tmpu||p==tmpv){
			// assert(deg[p]>2);
			res1=1ll*res*ksm(deg[p]-1,mod-2)%mod;
//			cerr<<res<<" "<<res1<<"\n";
			return;
		}
		for(auto i:e[p]){
			if(i==f) continue;
			dfs(i,p);
		}
	}
	
	void solve(){
		n=read<int>();
		k=read<int>();
		res=1;
		fac[0]=1;
		inv[0]=1;
		for(int i=1;i<=n;i++){
			fac[i]=1ll*fac[i-1]*i%mod;
			inv[i]=ksm(fac[i],mod-2);
			// cerr<<fac[i]<<" "<<inv[i]<<" "<<1ll*fac[i]*inv[i]%mod<<"\n";
		}
		for(int i=1;i<=n;i++){
			deg[i]=0;
			e[i].clear();
		}
		for(int i=1;i<n;i++){
			int u=read<int>();
			int v=read<int>();
			edge[i].first=u;
			edge[i].second=v;
			e[u].push_back(v);
			e[v].push_back(u);
			deg[u]++;
			deg[v]++;
		}
		edg.resize(k);
		for(auto &i:edg){
			i=read<int>();
		}
		tmpu=edge[edg[1]].first;
		tmpv=edge[edg[1]].second; 
		for(int i=1;i<=n;i++){
			res=1ll*res*fac[deg[i]-1]%mod;
		}
		int u=edge[edg[0]].first;
		int v=edge[edg[0]].second;
		res1=0;
		dfs(u,v);
		dfs(v,u);
		res=((2ll*res-res1)%mod+mod)%mod;
		printf("%d\n",res);
	}
	
}

namespace subtask3{
	//task 18
	void solve(){
		n=read<int>();
		k=read<int>();
		for(int i=1;i<n;i++){
			int u=read<int>();
			int v=read<int>();
		}
		edg.resize(k);
		for(auto &i:edg){
			i=read<int>();
		}
		printf("1\n");
	}
} 

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	
	C=read<int>();
	T=read<int>();
	
	while(T--){
		if(C<=6){
			subtask1::solve();
		}else if(C>=7&&C<=10){
			subtask2::solve();
		}else if(C==18){
			subtask3::solve();
		}
	}
	
	return 0;
}
