#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
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*10+ch-'0';ch=getchar();}
return x*f;
}
const int N=100010,mod=1e9+7,iv2=5e8+4;
int t,n,k,u[N],v[N],w[N],in[N];
int fr[N],nex[N<<1],to[N<<1],fl[N<<1],ct;
int rt,jc[N],g[N],ig[N],f[N],gf[N],ff[N],ans;
int ksm(int p,int k){
int x=1;
while(k){
if(k&1)x=x*p%mod;
p=p*p%mod;
k>>=1;
}
return x;
}
void add(int x,int y,int z){
nex[++ct]=fr[x];
to[ct]=y;
fl[ct]=z;
fr[x]=ct;
}
void dfs(int x,int fa){
g[x]=ig[x]=1;f[x]=gf[x]=ff[x]=0;int tt=0;
for(int i=fr[x];i;i=nex[i]){
int y=to[i];
if(y==fa)continue;
dfs(y,x);
int a=g[y],b=f[y];
if(fl[i])b=a;
ff[x]=(ff[x]*a+f[x]*a+gf[x]*b)%mod;
gf[x]=(gf[x]*a+g[x]*(a-b+mod))%mod;
f[x]=(f[x]*a+g[x]*b)%mod;
g[x]=g[x]*a%mod;
tt++;
}
g[x]=g[x]*jc[tt]%mod;
f[x]=f[x]*jc[tt-1]%mod;
if(tt>=2)ff[x]=ff[x]*jc[tt-2]%mod;
ig[x]=ksm(g[x],mod-2);
if(x==rt)g[x]=g[x]*ksm(tt,mod-2)%mod;
}
void dfs2(int x,int fa,int vv){
int tt=0;
for(int i=fr[x];i;i=nex[i]){
int y=to[i];
if(y==fa)continue;
dfs2(y,x,g[x]*vv%mod*ig[y]%mod);
tt++;
}
if(x==rt){
ans=(ans+ff[x])%mod;
}
else ans=(ans+ff[x]*(tt-1)%mod*vv)%mod;
}
signed main(){
freopen("traverse.in","r",stdin);
freopen("traverse.out","w",stdout);
jc[0]=1;
for(int i=1;i<=N-10;i++){
jc[i]=jc[i-1]*i%mod;
}
t=read();t=read();
while(t--){
n=read(),k=read();ans=0;
for(int i=1;i<n;i++){
u[i]=read(),v[i]=read();w[i]=0;
}
for(int i=1;i<=k;i++){
w[read()]=1;
}
if(n==2){
cout<<"1\n";
continue;
}
memset(in,0,sizeof(in));
memset(fr,0,sizeof(fr));ct=0;
for(int i=1;i<n;i++){
in[u[i]]++,in[v[i]]++;
add(u[i],v[i],w[i]);
add(v[i],u[i],w[i]);
}
rt=0;
for(int i=1;i<=n;i++){
if(in[i]>=2&&!rt)rt=i;
}
dfs(rt,0);
dfs2(rt,0,1);
cout<<ans<<"\n";
}
return 0;
}