#include<bits/stdc++.h>
using namespace std;
long long read()
{
	long long f=1,x=0;
	char a=getchar();
	while(a<'0'||a>'9')
	{
		if(a=='-') f=-1;
		a=getchar();
	}
	while(a>='0'&&a<='9')
	{
		x=x*10+a-48;
		a=getchar();
	}
	return f*x;
}
const long long N=1e5,mod=1e9+7;
long long n,f[N][2],t,k,w[N][2],a[N];
struct node
{
	long long x,w;
};	
vector<node> v[N];
void dfs(int p,int fa)
{
	
	for(auto to:v[p])
	{
		if(to.x==fa) continue;
		dfs(to.x,fa);
		if(to.w) f[p][1]=(f[p][1]*((f[to.x][0]+f[to.x][1])%mod)%mod);
		else 
		{
			f[p][1]=f[p][1]+f[to.x][1]%mod;
			f[p][0]=(f[p][0]*(f[to.x][0]))%mod;
		}
	}
	
}
int main()
{
    freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
    t=read();t=read();
    while(t--)
    {
    	n=read();k=read();
    	for(int i=1;i<n;i++)
    	{
    		w[i][0]=read();w[i][1]=read();
    		f[i][0]=1;f[i][1]=1;a[i]=0;v[i].clear();
		}
		f[n][0]=1;f[n][1]=0;v[n].clear();
		for(int i=1;i<=k;i++)
		 a[read()]=1;
		for(int i=1;i<n;i++)
		 v[w[i][0]].push_back((node){w[i][1],a[i]});
		dfs(1,-1);
		printf("%lld\n",f[1][1]-1);
	}
	return 0;
} 
