#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+5;
const ll P=1e9+7;
ll qpow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a%P;
		a=a*a%P,b>>=1;
	}
	return res;
}
int C,T,n,K,a[N],b[N],fa[N];
ll f[N],g[N],jc[N];
vector<int> e[N],E[N];
void init(){
	jc[0]=1;
	for(int i=1;i<=N-5;i++) jc[i]=jc[i-1]*i%P;
}
void dfs0(int k,int ffa){
	fa[k]=ffa;
	for(int i=1;i<=E[k].size();i++){
		int v=E[k][i-1];
		if(v==ffa) continue;
		e[k].push_back(v),dfs0(v,k);
	}
}
void dfs(int k){
	f[k]=1;
	for(int i=1;i<=e[k].size();i++){
		int v=e[k][i-1];
		dfs(v);
		f[k]=f[k]*f[v]%P;
	}
	f[k]=f[k]*jc[e[k].size()]%P;
}
void dfs2(int k){
	g[k]=1;
	for(int v:e[k]){
		g[v]=f[k]*qpow(f[v],P-2)%P*g[fa[k]]%P;
		dfs2(v);
	}
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>C>>T;init();
	while(T--){
		cin>>n>>K;
		for(int i=1;i<=n;i++) E[i].clear(),e[i].clear();
		for(int i=1;i<n;i++){
			cin>>a[i]>>b[i];
			E[a[i]].push_back(b[i]);
			E[b[i]].push_back(a[i]);
		}
		dfs0(1,0),dfs(1),dfs2(1);
		int x,y,z;ll ans=0;
		for(int i=1;i<=K;i++){
			cin>>z;
			x=a[z],y=b[z];
			if(fa[x]!=y) swap(x,y);
			(ans+=f[x]*g[x]%P)%=P;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
