#include 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 >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(); }