#include<bits/stdc++.h>
using namespace std;
#define int long long
#define For(i,j,k) for(int i=(j);i<=(k);++i)
#define ForDown(i,j,k) for(int i=(j);i<=(k);--i)
#define within :
#define LJY main
typedef long long ll;
const int N=2e5+5,mod=1e9+7,inv2=5e8+4;
ll ksm(ll a,ll k){ll s=1;while(k){if(k&1) s=s*a%mod;a=a*a%mod;k>>=1;}return s;}
char buf[N<<2],*p1,*p2;
#define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,N<<2,stdin),p1==p2))?0:*p1++)
int read(){
char ch=getchar();int x=0,f=1;
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;
}
int n,k;
ll fac[N],ans;
vector<pair<int,int> >G[N];
int f[N],fa[N],val[N],siz[N],deg[N];
void dfs(int u,int fa){
ll val=1;f[u]=0;
if(deg[u]>=2) val=ksm(fac[deg[u]-1],mod-2)%mod*fac[deg[u]-2]%mod;
for(auto [v,id] within G[u]) if(v!=fa){
dfs(v,u);
if(::val[id]) ans=ans-f[v],f[v]=1;
ans=(ans-f[u]*f[v]%mod+mod)%mod;
f[u]=(f[u]+f[v]*val)%mod;
}fflush(stderr);
}
void ljy(){
n=read();k=read();
For(i,1,2*n) val[i]=siz[i]=deg[i]=0,G[i].clear();
For(i,1,n-1){
int u=read(),v=read();
G[u].emplace_back(v,i);
G[v].emplace_back(u,i);
deg[u]++,deg[v]++;
}For(i,1,k) val[read()]=1;
ans=k;dfs(1,0);
For(i,1,n) ans=ans*fac[deg[i]-1]%mod;
printf("%lld\n",ans);
}
signed LJY(){
freopen("traverse.in","r",stdin);
freopen("traverse.out","w",stdout);
fac[0]=1;For(i,1,N-1) fac[i]=fac[i-1]*i%mod;
read();int T=read();while(T--) ljy();
}