#include<bits/stdc++.h>
typedef unsigned int i4;
typedef unsigned long long i8;
const i8 I=1,MOD=1000000007,MX=100005;
i4 c,n,k;
std::vector<i4>T[MX];
std::pair<i4,i4>G[MX];
i4 e[MX],F[MX],flag[MX],cnt;
i4 dfs(i4 u){
	if(cnt==n-2)return 1;
	i4 ans=0;
	flag[u]=1;cnt++;
	for(auto v:T[G[u].first]){
		if(!flag[v])ans+=dfs(v);
	}
	for(auto v:T[G[u].second]){
		if(!flag[v])ans+=dfs(v);
	}
	flag[u]=0;cnt--;
	return ans;
}
void slove(){
	std::cin>>n>>k;
	for(i4 i=1,u,v;i!=n;++i){
		std::cin>>u>>v;
		T[u].push_back(i);
		T[v].push_back(i);
		G[i]={u,v};
	}
	for(i4 i=0;i!=k;++i)
		std::cin>>e[i];
	if(c==18){std::cout<<"1\n";return;}
	if(c==19||c==20||c==21){
		n--;
		std::cout<<(I*k*F[n-1]+MOD-I*k*(k-1)/2%MOD*F[n-2]%MOD)%MOD<<"\n";
		return;
	}
	std::cout<<dfs(e[0])<<"\n";
	return;
}
int main(){
	std::ios::sync_with_stdio(0);
	std::cin.tie(0),std::cout.tie(0);
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	
	F[0]=1;for(i4 i=1;i!=MX;++i)F[i]=I*F[i-1]*i%MOD;
	i4 T;std::cin>>c>>T;
	while(T--)slove();
	return 0;
}
