#include<bits/stdc++.h>
#define ci const int
#define ll long long
using namespace std;
int read(){
	char ch=getchar();
	int res=0;
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
	return res;
}
ci N=1e5+5,mod=1e9+7;
inline void add(int &x,ci v){
	x+=v,x-=x<mod?0:mod;
}
inline void sub(int &x,ci v){
	x-=v,x+=x<0?mod:0;
}
ll qk(ll x,int y=mod-2){
	ll ans=1;
	while(y){
		if(y&1)ans=ans*x%mod;
		x=x*x%mod,y>>=1;
	}
	return ans;
}
int fac[N],dfac[N],inv[N];
int n,k,x[N],y[N],deg[N],ans,tn[N];
int head[N],nx[N<<1],to[N<<1],id[N<<1],tot;
int f[N];//子树内有的方案数
bool h[N];
void Init(){
	for(int i=1;i<=n;++i){
		deg[i]=0;
		head[i]=0;
		h[i]=0;
		f[i]=0;
	}
	tot=0;
}
void add(ci x,ci y,ci i){
	to[++tot]=y,nx[tot]=head[x],head[x]=tot,id[tot]=i;
}
void dfs(ci x,ci fa){
	f[x]=0;
	int g=0,t=0;
	for(int i=head[x],y;i;i=nx[i]){
		if((y=to[i])==fa)continue;
		dfs(y,x);
		if(h[id[i]]){//choose
			sub(g,(ll)f[x]*(1+f[y])%mod);//two
			sub(t,f[y]);//one
		}
		add(g,(ll)f[x]*f[y]%mod);//not choose
		if(h[id[i]]){//choose
			sub(f[x],(1+f[y])%mod);
		}
		add(f[x],f[y]);//not choose
	}
	g=(ll)g*tn[x]%mod;
	add(ans,g);
	add(ans,t);
	f[x]=(ll)f[x]*tn[x]%mod;
}
void Work(){
	n=read(),k=read();
	for(int i=1;i<n;++i)x[i]=read(),y[i]=read();
	for(int i=1;i<n;++i)
		++deg[x[i]],++deg[y[i]],
		add(x[i],y[i],i),add(y[i],x[i],i);
	for(int i=1;i<=n;++i)if(deg[i]>=2)tn[i]=(ll)dfac[deg[i]-1]*fac[deg[i]-2]%mod;
	for(int i=1;i<=k;++i)h[read()]=1;
	ans=0;
	dfs(1,0);
	ans=(mod-ans)%mod;
	int t=1;
	for(int i=1;i<=n;++i)t=(ll)t*fac[deg[i]-1]%mod;
	ans=(ll)ans*t%mod;
	add(ans,(ll)k*t%mod);
	printf("%d\n",ans);
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	fac[0]=fac[1]=dfac[0]=dfac[1]=inv[1]=1;
	for(int i=2;i<N;++i)
		fac[i]=(ll)fac[i-1]*i%mod,
		inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod,
		dfac[i]=(ll)dfac[i-1]*inv[i]%mod;
	int Id=read(),T=read();
	while(T--)Work(),Init();
	return 0;
}