#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int mod=1e9+7;
int c,t;
int n,k;
int u[N],v[N];
int head1[N],nxt1[N<<1],to1[N<<1],id[N<<1];
int cnt1=0;
void add1(int uu,int vv,int ik){
	nxt1[++cnt1]=head1[uu];
	to1[cnt1]=vv;
	head1[uu]=cnt1;
	id[cnt1]=ik;
}

int head2[N],nxt2[N<<1],to2[N<<1],id2[N<<1];
int cnt2=0;
void add2(int uu,int vv,int idd){
	for(int i=head2[uu];~i;i=nxt2[i]){
		if(to2[i]==vv){
			return ;
		}
	}
	nxt2[++cnt2]=head2[uu];
	to2[cnt2]=vv;
	head2[uu]=cnt2;
	id2[cnt2]=idd;
}

int vis[N],dis[N];
int cnt=0;
void dfs1(int x,int y,int lai_id){
	for(int i=head1[x];~i;i=nxt1[i]){//加新点对应的新边 
		int v=to1[i];
		if(!vis[v]){
			cnt++;
			add2(lai_id,id[i],cnt);
			add2(id[i],lai_id,cnt);
			vis[v]=1;
			dfs1(v,x,id[i]);
			vis[v]=0; 
		}
		
	}
	for(int i=head1[y];~i;i=nxt1[i]){//加新点对应的新边 
		int v=to1[i];
		if(!vis[v]){
			cnt++;
			add2(lai_id,id[i],cnt);
			add2(id[i],lai_id,cnt);
			vis[v]=1;
			dfs1(v,y,id[i]);
			vis[v]=0; 
		}
		
	}
}
int maxx=0;
int tb[N],td[N],du[N]; 
void dfs2(int x,int ti){
	vis[x]=ti,dis[x]=ti;
	for(int i=head2[x];~i;i=nxt2[i]){
		int v=to2[i];
		if(!vis[v]){
			dfs2(v,ti+1);
			
		}else if(dis[v]<dis[x]){
			dis[x]=dis[v];
		}
	}
}
bool vis1[N],vis2[N];
void dfs3(int x){
	for(int i=head2[x];~i;i=nxt2[i]){
		int v=to2[i];
		if(dis[x]==dis[v]&&(!vis2[id2[i]])){
			vis2[id2[i]]=1;
			tb[dis[x]]++;
		} 
		if(!vis1[v]){
			vis1[v]=1;
			dfs3(v);
			vis1[v]=0;
		}
	}
}

long long co(int x,int y){
	long long a=1,b=1,c=1;
	for(int i=1;i<=x;i++){
		a=(a*i)%mod;
	}
	for(int i=1;i<=x-y;i++){
		b=(b*i)%mod;
	}
	for(int i=1;i<=y;i++){
		c=(c*i)%mod;
	}
	return (a/(b*c))%mod;
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%d%d",&c,&t);
	while(t--){
		
		memset(head1,-1,sizeof head1);
		memset(head2,-1,sizeof head2);
		memset(id,0,sizeof id);
		memset(vis,0,sizeof vis);
		memset(dis,0,sizeof dis);
		memset(td,0,sizeof td);
		memset(tb,0,sizeof tb);
		memset(vis1,0,sizeof vis1);
		memset(vis2,0,sizeof vis2);
		cnt1=0,cnt2=0;
		
		scanf("%d%d",&n,&k); 
		for(int i=1;i<n;i++){
			scanf("%d%d",&u[i],&v[i]);//边的编号将作为新的点的编号 
			add1(u[i],v[i],i);
			add1(v[i],u[i],i);
		}
		vis[1]=1;
		for(int i=head1[1];~i;i=nxt1[i]){
			int v=to1[i];
			vis[v]=1;
			dfs1(v,1,id[i]);
			vis[v]=0;
		}
		vis[1]=0;
		dfs2(1,1);
		for(int i=1;i<n;i++){
			for(int j=head2[i];~j;j=nxt2[j]){
				int v=to2[j];
				if(dis[i]==dis[v]){
					du[i]++;
				}
			}
		}
		for(int i=1;i<n;i++){
			td[dis[i]]++;
			maxx=max(maxx,dis[i]);
		}
		
		vis1[1]=1;
		dfs3(1);
		long long ans=1;
		for(int i=1;i<=k;i++){
			int guan;
			scanf("%d",&guan);
			ans=((ans*co(tb[dis[guan]]-du[guan],td[dis[guan]]-2))%mod*du[guan])%mod;
		}
		printf("%lld",ans);
	}
	return 0;
}
/*
1 1
4 1
1 2
2 3
2 4
1

2
*/
/*
7 1
5 2
1 2
1 3
2 4
2 5
1 3

3
*/

