#include<bits/stdc++.h>
namespace xcy{
const int MAXN=100005;
typedef long long ll;
const ll MOD=1e9+7;
ll fc[MAXN],ic[MAXN],iv[MAXN],deg[MAXN],dg[MAXN],head[MAXN],f[MAXN][2],e[MAXN][2],cnt,t,n,m,p,i,j,k,ans,siz;
struct Ed{ll pre,to,val;}ed[MAXN<<1];std::bitset<MAXN>vis,is;
inline void fr(ll &X){X=0;char C=getchar();while(!isdigit(C))C=getchar();while(isdigit(C))X=X*10+C-'0',C=getchar();}
inline void out(ll X){if(!X)return;out(X/10);putchar(X%10+'0');}
inline void fo(ll X,char C=' '){if(!X)putchar('0');if(X<0)putchar('-'),X=-X;out(X),putchar(C);}
inline void add(ll F,ll T,ll V){ed[++cnt]={head[F],T,V};head[F]=cnt;++deg[T];}
inline ll pw(ll A,ll B){ll Res=1;for(;B;B>>=1,(A*=A)%=MOD)if(B&1)(Res*=A)%=MOD;return Res;}
inline void init(ll N)
{
for(i=2,iv[0]=iv[1]=1;i<=N;++i)iv[i]=(MOD-MOD/i)*iv[MOD%i]%MOD;
for(i=2,fc[0]=fc[1]=ic[0]=ic[1]=1;i<=N;++i)
fc[i]=fc[i-1]*i%MOD,ic[i]=ic[i-1]*iv[i]%MOD;
}
inline void dfs(ll N)
{
vis[N]=1;for(ll I=head[N],J;I;I=ed[I].pre)if(!vis[J=ed[I].to])
dfs(J),(f[J][1]+=ed[I].val*f[J][0])%=MOD,f[J][0]=(ed[I].val?0:f[J][0]),
((N==1&°[N]==1)?(ans+=f[J][1]*fc[dg[J]])%=MOD:0),
(ans+=(f[N][0]*f[J][1]+f[N][1]*(f[J][0]+f[J][1]))%MOD*fc[dg[J]]%MOD*fc[dg[N]])%=MOD,
(f[N][0]+=f[J][0]*fc[dg[J]]%MOD*ic[deg[N]-1])%=MOD,
(f[N][1]+=f[J][1]*fc[dg[J]]%MOD*ic[deg[N]-1])%=MOD;
if(deg[N]==1&&N!=1)f[N][ed[head[N]].val]=1;
}
int mian()
{
freopen("traverse.in","r",stdin);
freopen("traverse.out","w",stdout);
init(100000);fr(t);fr(t);while(t--){memset(head,0,sizeof(head));cnt=ans=0;siz=1;
memset(deg,0,sizeof(deg));memset(f,0,sizeof(f));vis.reset();is.reset();
fr(n);fr(m);for(i=1;i<n;++i)fr(e[i][0]),fr(e[i][1]);for(i=1;i<=m;++i)fr(j),is[j]=1;
for(i=1;i<n;++i)add(e[i][0],e[i][1],is[i]),add(e[i][1],e[i][0],is[i]);
for(i=1;i<=n;++i)(siz*=fc[deg[i]-1])%=MOD,dg[i]=std::max(0ll,deg[i]-2);dfs(1);fo(ans*siz%MOD,'\n');
}return 0;
}}
int main(){return xcy::mian();}