#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
const int N=1e5+5,M=1e5,P=1e9+7,G=5e8+4;
int c,T,n,k,cnt=1;
int head[N],deg[N];
ll ans,sum;
ll fac[N],inv[N],f[N],g[N];
bool vis[N];
struct Edge{
int v,w,to;
}e[N<<1];
il void AddEdge(int x,int y,int z){
e[cnt]={y,z,head[x]};
head[x]=cnt++,deg[y]++;
return ;
}
il ll QuickPow(ll a,int b){
ll res=1;
while(b){
if(b&1)res=res*a%P;
a=a*a%P;
b>>=1;
}
return res;
}
il void Dfs(int x,int fa){
f[x]=0;
for(int i=head[x];i;i=e[i].to){
int y=e[i].v,z=e[i].w;
if(y==fa)continue;
Dfs(y,x);
if(vis[z]){
f[x]=(f[x]+1)%P;
ans=(ans-sum*f[y]%P)%P;
}else f[x]=(f[x]+f[y])%P;
}
if(deg[x]>1)f[x]=f[x]*fac[deg[x]-2]%P*inv[deg[x]-1]%P;
return ;
}
il void Dfs2(int x,int fa){
for(int i=head[x];i;i=e[i].to){
int y=e[i].v,z=e[i].w;
if(y==fa)continue;
ll _f=f[x];
if(deg[x]>1)_f=_f*inv[deg[x]-2]%P*fac[deg[x]-1]%P;
if(vis[z])_f=(_f-1)%P;
else _f=(_f-f[y])%P;
if(deg[x]>1)_f=_f*fac[deg[x]-2]%P*inv[deg[x]-1]%P;
if(vis[z]){
g[y]=1;
ans=(ans-(g[x]+_f)*sum%P)%P;
}else g[y]=(g[x]+_f)%P;
if(deg[y]>1)g[y]=g[y]*fac[deg[y]-2]%P*inv[deg[y]-1]%P;
Dfs2(y,x);
}
return ;
}
il void Build(){
cin>>n>>k;
cnt=1;
for(int i=1;i<=n;i++)head[i]=deg[i]=0;
for(int i=1;i<n;i++)vis[i]=false;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
AddEdge(u,v,i),AddEdge(v,u,i);
}
for(int i=1;i<=k;i++){
int x;cin>>x;
vis[x]=true;
}
ans=0,sum=1;
for(int i=1;i<=n;i++)sum=sum*fac[deg[i]-1]%P;
Dfs(1,0),Dfs2(1,0);
ans=(ans*G%P+k*sum%P)%P;
cout<<(ans+P)%P<<"\n";
return ;
}
int main(){
freopen("traverse.in","r",stdin);
freopen("traverse.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
fac[0]=1;
for(int i=1;i<=M;i++)fac[i]=fac[i-1]*i%P;
inv[M]=QuickPow(fac[M],P-2);
for(int i=M-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%P;
cin>>c>>T;
while(T--)Build();
return 0;
}