#include<bits/stdc++.h>
using namespace std;
const long long MAXN=1010100,Moder_=1e9+7;
struct edg
{
	long long v,id;
};
vector<edg> edge[MAXN];
long long n,K,e[MAXN],tp[MAXN][2],eg[MAXN][2],f[MAXN][2][2],vis[MAXN][2][2],fac[MAXN],inv[MAXN],vt[MAXN];
long long poww(long long ta,long long tb)
{
	long long ans=1;
	while(tb>0)
	{
		if(tb&1)
		{
			ans=(ans*ta)%Moder_;
		}
		ta=(ta*ta)%Moder_;
		tb/=2;
	}
	return ans;
}
void dfs(long long x,long long v)
{
	if(vis[x][v][0])
	{
		return;
	}
	vis[x][v][0]=1;
	f[x][v][0]=1;
	long long rp=eg[x][v],i,t,ti,m=edge[rp].size()-1;
	f[x][v][0]=fac[m];
	for(i=0;i<=m;i++)
	{
		ti=edge[rp][i].id;
		if(ti==x)
		{
			continue;
		}
		else
		{
			dfs(ti,(rp==eg[ti][0])?1:0);
			f[x][v][0]=(f[x][v][0]*f[ti][(rp==eg[ti][0])?1:0][0])%Moder_;
		}
	}
	return;
}
void dfs2(long long x,long long v,long long dl)
{
	f[x][v][1]=(f[x][v][1]-dl+Moder_)%Moder_;
	long long rp=eg[x][1-v],i,t,ti,m=edge[rp].size()-1;
	if(m==0)
	{
		return;
	}
	dl=(dl*fac[m-1])%Moder_;
	for(i=0;i<=m;i++)
	{
		ti=edge[rp][i].id;
		if(ti==x||vt[ti])
		{
			continue;
		}
		else
		{
			dfs2(ti,(rp==eg[ti][0])?0:1,dl);
		}
	}
	return;
}
void init()
{
	fac[0]=fac[1]=inv[0]=inv[1]=1;
	long long i;
	for(i=2;i<=MAXN-1;i++)
	{
		fac[i]=(fac[i-1]*i)%Moder_;
	}
	inv[MAXN-1]=poww(fac[MAXN-1],Moder_-2);
	for(i=MAXN-2;i>=2;i--)
	{
		inv[i]=(inv[i+1]*(i+1))%Moder_;
	}
	return;
}
void work()
{
	long long i,j,ta,tb,ans=0,t;
	scanf("%lld%lld",&n,&K);
	for(i=1;i<=n;i++)
	{
		vt[i]=0;
		edge[i].clear();
		f[i][0][0]=f[i][0][1]=f[i][1][0]=f[i][1][1]=vis[i][0][0]=vis[i][0][1]=vis[i][1][0]=vis[i][1][1]=0;
	}
	for(i=1;i<=n-1;i++)
	{
		scanf("%lld%lld",&ta,&tb);
		eg[i][0]=ta;
		eg[i][1]=tb;
		edge[ta].push_back(edg{tb,i});
		tp[i][0]=edge[ta].size();
		edge[tb].push_back(edg{ta,i});
		tp[i][1]=edge[tb].size();
	}
	for(i=1;i<=n-1;i++)
	{
		for(j=0;j<=1;j++)
		{
			if(!vis[i][j][0])
			{
				dfs(i,j);
			}
		}
	}
	for(i=1;i<=n-1;i++)
	{
		for(j=0;j<=1;j++)
		{
			f[i][j][1]=f[i][j][0];
		}
	}
	for(i=1;i<=K;i++)
	{
		scanf("%lld",&t);
		ans=(ans+f[t][0][1]*f[t][1][1])%Moder_;
		dfs2(t,0,f[t][0][1]);
		dfs2(t,1,f[t][1][1]);
		vt[t]=1;
	}
	printf("%lld\n",ans);
	return;
}
int main()
{
	init();
//	freopen("traverse.in","r",stdin);
//	freopen("traverse.out","w",stdout);
	long long c,T;
	scanf("%lld%lld",&c,&T);
	while(T--)
	{
		work();
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
