#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]]){
sub(g,(ll)f[x]*(1+f[y])%mod);
sub(t,f[y]);
}
add(g,(ll)f[x]*f[y]%mod);
if(h[id[i]]){
sub(f[x],(1+f[y])%mod);
}
add(f[x],f[y]);
}
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;
}