#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int qpow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
struct edge{
	int to,nxt;
}e[200001];
int head[100001],cnt;
void add(int u,int v){
	cnt++;
	e[cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
vector<int> ee[200001];
int n,k;
int a[100001];
int fl[100001];
map<set<pair<int,int> >,int> mp;
int ans=0;
int vis[100001];
set<pair<int,int> > nw;
void dfs1(int x,int fa){
	for(int i=0;i<ee[x].size();i++){
		int v=ee[x][i];
		if(vis[v]) continue;
		nw.insert({min(v,x),max(v,x)});
		vis[v]=1;
		dfs1(v,x);
	}
}
void dfs(int x){
	if(x>n-1){
		for(int i=1;i<=k;i++){
			nw.clear();
			for(int j=1;j<n;j++) vis[j]=0;
			vis[a[i]]=1;
			dfs1(a[i],0);
//			for(auto tp:nw) cout<<tp.first<<" "<<tp.second<<"\n";
//			cout<<"\n";
			if(mp[nw]==0) mp[nw]++,ans++;
		}
		return;
	}
	do{
		dfs(x+1); 
	}while(next_permutation(ee[x].begin(),ee[x].end()));
}
int fac[100001],inv[100001];
signed main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0); 
	int c,T;
	cin>>c>>T;
	fac[0]=inv[0]=1;
	for(int i=1;i<=1e5;i++) fac[i]=fac[i-1]*i%mod,inv[i]=qpow(fac[i],mod-2);
	while(T--){
		cin>>n>>k;
		cnt=1;
		for(int i=1;i<=n;i++) head[i]=0;
		bool flagch=1,flagju=1;
		for(int i=1,u,v;i<n;i++){
			cin>>u>>v;
			if(u!=i||v!=i+1) flagch=0;
			if(u!=1||v!=i+1) flagju=0;
			add(u,v);
			add(v,u);
		}
		for(int i=1;i<=k;i++) cin>>a[i];
		if(flagch){
			cout<<1<<"\n"; 
			continue;
		}
		if(flagju){
			int ans=(k*fac[n-2]%mod-(k*(k-1)/2)%mod*fac[n-3]%mod+mod)%mod;
			cout<<ans<<"\n";
			continue;
		}
//		cout<<"--\n"; 
		for(int i=1;i<n;i++) ee[i].clear();
		for(int i=1;i<n;i++){
			int u=e[2*i].to,v=e[2*i+1].to;
			for(int j=head[u];j;j=e[j].nxt){
				int vv=e[j].to;
				if(vv!=v) ee[i].push_back(j/2);
			} 
			for(int j=head[v];j;j=e[j].nxt){
				int vv=e[j].to;
				if(u!=vv) ee[i].push_back(j/2);
			} 
		}
		for(int i=1;i<n;i++){
			sort(ee[i].begin(),ee[i].end());
//			ee[i].erase(unique(ee[i].begin(),ee[i].end()),ee[i].end());
		}
		mp.clear();
		ans=0;
		dfs(1);
		cout<<ans<<"\n";
	}
}
