#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,mod=1e9+7; 
int read(){
	int num=0,typ=1,c=getchar();
	while('0'>c||c>'9'){
		if(c=='-') typ=-1;
		c=getchar();
	}while('0'<=c&&c<='9'){
		num=num*10+c-48;
		c=getchar(); 
	}return num*typ;
}
int c,t;
int n,k,ans;
//vector<int>vec[N];
int u[N],v[N];
int head[N],nxt[N<<1],to[N<<1],id[N<<1],tot;
bool vis[N<<1];
int cnt[N],num[N];
int fac[N];
void edge(int x,int y,int z){
	to[++tot]=y;
	nxt[tot]=head[x];
	id[tot]=z;
	head[x]=tot;
}
void dfs(int u,int fa){
	while(vis[head[u]]) head[u]=nxt[head[u]];
	for(int i=head[u];i;i=nxt[i]){
		if(vis[i]) continue;
		int v=to[i];
		if(v==fa) continue;
		dfs(v,u);
		cnt[v]++;
		vis[i]=1;
		while(vis[nxt[i]]) nxt[i]=nxt[nxt[i]];
	}
}
signed main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	fac[0]=1;
	for(int i=1;i<N;i++){
		fac[i]=(fac[i-1]*i)%mod;
	}
	c=read();
	for(t=read();t;t--){
		for(int i=1;i<=tot;i++){
			vis[i]=0;
		}
		n=read();k=read();tot=0;
		for(int i=1;i<=n;i++){
			num[i]=cnt[i]=head[i]=0;
		}
		for(int i=1;i<n;i++){
			u[i]=read(),v[i]=read();
//			vec[u[i]].push_back(i);
//			vec[v[i]].push_back(i);
			edge(u[i],v[i],i);edge(v[i],u[i],i);
			num[u[i]]++,num[v[i]]++;
		}
		for(int i=1;i<=k;i++){
			if(i%1000==0){
				i++;
				i--;
			}
			int x=read();
//			cnt[u[x]]++;
			dfs(u[x],0);
			dfs(v[x],0);
//			cnt[v[x]]++;
		}
		ans=1;
		for(int i=1;i<=n;i++){
			if(num[i]>=3){
				int res=0;
				for(int j=1;j<=cnt[i];j++){
					(res+=fac[num[i]-2]*(num[i]-j)%mod)%=mod;
				}
				(ans*=res)%=mod; 
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
