#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
const int mo=1000000007ll;
int n,k,ans,a[N],v[N],jie[N];
struct edge{
	int x,y;
	bool operator <(const edge &A) const{
		return x<A.x;
	}
}e[N];
vector <int> d[N];
int TT;
void dfs(int id){
	int x=e[id].x,y=e[id].y;
	if(!v[x]){
		v[x]=1;
//		if(!d[x].size()) printf("NO\n");
		ans=ans*jie[d[x].size()-1]%mo;
		for(int t:d[x]){
			if(t==id) continue;
			dfs(t);
		}
	}		
	if(!v[y]){
		v[y]=1;
		ans=ans*jie[d[y].size()-1]%mo;
		for(int t:d[y]){
//			ans=ans*jie[d[y].size()-1]%mo;
			if(t==id) continue;
			dfs(t);
		}
	}
//	if(clock()>99500) printf("NO\n");
//	printf("%d\n",id); 
}
void work(){
	n=read(),k=read(),ans=1;
	jie[1]=jie[0]=1;
	for(int i=1;i<=n;i++) jie[i]=jie[i-1]*i%mo;
	for(int i=1;i<=n;i++) v[i]=0;
//	printf("   %d %d\n",n,k);
//	printf("     %d %d\n",n,k);
//	memset(v,0,sizeof(v));
	
//	printf("   %d %d\n",n,k);
	for(int i=1;i<=n;i++) d[i].clear();
	for(int i=1;i<n;i++){
		e[i].x=read(),e[i].y=read();
		d[e[i].x].push_back(i);
		d[e[i].y].push_back(i);
	}
	
//	printf("   %d %d\n",n,k);
	for(int i=1;i<=k;i++){
		a[i]=read();
//		if(!TT) continue;
		dfs(a[i]);
	}
	
//	printf("   %d %d\n",n,k);
	printf("%lld\n",ans);
}
signed main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c=read(),T=read();
	if(c==18){
		for(int i=1;i<=T;i++) printf("1\n");
		return 0;
	}
	for(int i=1;i<=T;i++,TT++) work();
	return 0;
}

