#include using namespace std; #define int long long #define rep(i,j,k) for(int i=(j);i<=(k);i++) #define per(i,j,k) for(int i=(j);i>=(k);i--) #define pb emplace_back #define mp make_pair #define fi first #define se second using vi=vector; using pi=pair; namespace IO{ char buf[1<<26], *iS=buf; void init(){ buf[ fread(buf, 1, 1<<26, stdin) ]=0; } #define getchar() (*iS++) int read(){ int res=0; char ch=' '; do{ ch=getchar(); }while(!isdigit(ch)); do{ res=res*10+ch-48; ch=getchar(); }while(isdigit(ch)); return res; } #undef getchar } using IO::read; const int mod=1e9+7, i2=(mod+1)/2; int qpow(int x,int y=mod-2){ int res=1; while(y){ if(y%2) res=res*x%mod; x=x*x%mod; y/=2; } return res; } const int N=1e5+5; int fac[N], ifac[N]; void init(){ fac[0]=1; rep(i,1,N-1){ fac[i]=fac[i-1]*i%mod; } ifac[N-1]=qpow(fac[N-1]); per(i,N-1,1){ ifac[i-1]=ifac[i]*i%mod; } } void solve(){ int n=read(), k=read(); vector> G(n+1); rep(i,1,n-1){ int u=read(), v=read(); G[u].pb(v, i); G[v].pb(u, i); } vector st(n+1); rep(i,1,k){ int id=read(); st[id]=1; } int ans0=1, ansx=1; rep(i,1,n){ int c=G[i].size(); if(c>1){ (ans0*= fac[c-2] )%=mod; } } rep(i,1,n){ int c=G[i].size(); if(c>1){ (ansx*= c-1 )%=mod; } } (ansx*= k )%=mod; vi f(n+1), g(n+1), h(n+1), ans(n+1); auto dfs=[&](auto self,int u,int p)->void { f[u]=1; for(auto [v,id]:G[u]){ if(id!=p){ self(self, v, id); ans[u]=(ans[u]*f[v] + ans[v]*f[u])%mod; h[u]=(h[u]*f[v] + g[u]*g[v] + (st[id]? g[u]*f[v]: 0))%mod; g[u]=(f[u]*g[v] + g[u]*f[v] + (st[id]? f[u]*f[v]: 0))%mod; f[u]=f[u]*f[v]%mod; } } int c=G[u].size(); if(c>1){ (f[u]*= c-1 )%=mod; (ans[u]*= c-1 )%=mod; } (ans[u]+= h[u] )%=mod; if(st[p]){ (ans[u]+= g[u] )%=mod; g[u]=0; } }; dfs(dfs, 1, 0); int Ans=(ansx-ans[1]+mod)%mod*ans0%mod; cout<< Ans <<'\n'; } signed main(){ assert(freopen("traverse.in","r",stdin)); assert(freopen("traverse.out","w",stdout)); ios::sync_with_stdio(0);cin.tie(0); IO::init(); init(); int tid=read(), t=read(); while(t--){ solve(); } }