#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define MP make_pair
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
const int N=1e5+10,M=1e6+10,mod=1e9+7;
inline void Add(int &x,int y){x+=y;if(x>=mod) x-=mod;}
inline void Del(int &x,int y){x-=y;if(x<0) x+=mod;}
inline int add(int x,int y){x+=y;return x>=mod?x-mod:x;}
inline int del(int x,int y){x-=y;return x<0?x+mod:x;}
int f[N][2][2][2],F[3][2][2],G[3][2][2],n,K;
bool vs[N];
int fac[N];
int d[N],rt;
vector<pii> e[N];
int ans=0;
void dfs(int u,int fa,int id){
	for(pii x:e[u]) if(x.fi!=fa){
		int v=x.fi,i=x.se;dfs(v,u,i);
	}
	memset(F,0,sizeof(F));
	F[0][0][1]=1;
	for(pii x:e[u]) if(x.fi!=fa){
		int v=x.fi;
		for(int j=0;j<3;j++) for(int k=0;k<2;k++) for(int o=0;o<2;o++) G[j][k][o]=F[j][k][o],F[j][k][o]=0;
		for(int j=0;j<3;j++) for(int k=0;k<2;k++) for(int o=0;o<2;o++) if(G[j][k][o]) for(int a=0;a<2;a++) for(int b=0;b<2;b++) for(int c=0;c<2;c++) if(f[v][a][b][c]){
			if(j+(!a)<3) Add(F[j+(!a)][(k&c)|(b&(!a)&o)][o&c],1ll*G[j][k][o]*f[v][a][b][c]%mod);
		}
	}
	if(d[u]>1){
		for(int x=0;x<2;x++) for(int a=0;a<2;a++){
			int j=2-(!x);
			for(int k=0;k<2;k++) for(int o=0;o<2;o++) if(F[j][k][o]){
				int b=k|(vs[id]&(!x)&(!a)&o);
				Add(f[u][a][b][o&(!x)],1ll*fac[d[u]-2]*F[j][k][o]%mod);
			}
		}
	}
	else{
		if(u!=rt){
			f[u][1][0][1]=1;
			f[u][0][vs[id]][1]=1;
		}
		else ans=add(F[1][1][0],F[1][1][1]);
	}
}
void solve(){
	cin>>n>>K;
	for(int i=1;i<=n;i++) d[i]=0,e[i].clear();
	for(int i=1,u,v;i<n;i++) vs[i]=0,cin>>u>>v,e[u].pb(MP(v,i)),e[v].pb(MP(u,i)),d[u]++,d[v]++;
	for(int i=1,x;i<=K;i++) cin>>x,vs[x]=1;
	rt=0;for(int i=1;i<=n;i++) if(d[i]==1) rt=i;
	memset(f,0,sizeof(f));
	dfs(rt,0,0);
	cout<<ans<<'\n';
}
signed main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	fac[0]=1;for(int i=1;i<N;i++) fac[i]=1ll*fac[i-1]*i%mod;
	int c,T;cin>>c>>T;
	while(T--) solve();
	return 0;
}
