#include <cstdio>
#include <vector>
#define ll long long
using namespace std;
const int N=1e5+10;
const int Mod=1e9+7;
int c,t,n,k,ans;
int key[N];
ll cnt[N];
struct Edge{
	int u,v;
}line[N];
vector<int> g[N];
void Init(){
	for(int i=1;i<=n;i++){
		cnt[i]=line[i].u=line[i].v=0;
		g[i].clear();
	}
}
void dfs(int nd,int fa){
	cnt[nd]=1;
	if(g[nd].size()==1) return ;
	for(int j=0,nxt;j<g[nd].size();j++){
		nxt=g[nd][j];
		if(nxt==fa) continue;
		dfs(nxt,nd);
		cnt[nd]=(cnt[nd]*cnt[nxt])%Mod;
	}
	for(int i=2;i<g[nd].size();i++)
		cnt[nd]=(cnt[nd]*i)%Mod;
}
int max(int a,int b){return a>b?a:b;}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%d%d",&c,&t);
	while(t--){
		Init();
		scanf("%d%d",&n,&k);
		for(int i=1;i<n;i++){
			scanf("%d%d",&line[i].u,&line[i].v);
			g[line[i].u].push_back(line[i].v);
			g[line[i].v].push_back(line[i].u);
		}
		for(int i=1;i<=k;i++)
			scanf("%d",&key[i]);
		ans=0;
		for(int i=1;i<=k;i++){
			for(int j=1;j<=n;j++) cnt[j]=0;
			if(g[line[key[i]].u].size()==1) cnt[line[key[i]].u]=0;
			else dfs(line[key[i]].u,line[key[i]].v);
			if(g[line[key[i]].v].size()==1) cnt[line[key[i]].v]=0;
			else dfs(line[key[i]].v,line[key[i]].u);
			if(!cnt[line[key[i]].u] && !cnt[line[key[i]].v]) ans=max(ans,1);
			else
				ans=max(ans,(cnt[line[key[i]].u]+cnt[line[key[i]].v])%Mod);
		}
		printf("%d\n",ans);
	}
	return 0;
}
