#include<bits/stdc++.h>
#define il inline
#define mst(a,x) memset(a,x,sizeof a)
using namespace std;
const int N=1e5+10,MOD=1e9+7;
int C,n,k,id,a[N],hd[N],U[N],V[N];
struct EDGE {int to,ne;} e[N*2];
il void add(int u,int v) {e[++id]={v,hd[u]},hd[u]=id;}
namespace sol1 {
	int ans,fac[N];
	void dfs(int u,int fa) {
		int cnt=0;
		for(int i=hd[u],v;i;i=e[i].ne) if((v=e[i].to)!=fa) cnt++,dfs(v,u);
		ans=1ll*ans*fac[cnt]%MOD; 
	}
	void sol() {
		fac[0]=1; for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD;
		ans=1,dfs(U[a[1]],V[a[1]]),dfs(V[a[1]],U[a[1]]),printf("%d\n",ans);
	}
}
void sol() {
	scanf("%d%d",&n,&k),id=0,mst(hd,0);
	for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),U[i]=u,V[i]=v,add(u,v),add(v,u);
	for(int i=1;i<=k;i++) scanf("%d",&a[i]);
	if(C<=6||C==18) return sol1::sol();
}
int main() {
	freopen("traverse.in","r",stdin),freopen("traverse.out","w",stdout);
	int T; scanf("%d%d",&C,&T); for(;T--;) sol();
}

