#include<stdio.h>//4
#include<iostream>
#include<string>
#include<map>
using namespace std;
const int p=1000000007;
bool flag1,flag2;
struct graph
{
	struct edge
	{
		int from,to,nxt,id;
	}e[400005];
	int head[200005],cnt;
	void add(int u,int v,int a)
	{
		e[++cnt].to=v;
		e[cnt].from=u;
		e[cnt].nxt=head[u];
		e[cnt].id=a;
		head[u]=cnt;
		return;
	}	
}e1,e2;
int c,T;
int n,k,u,v,a[200005];
bool vis[200005];
long long dfs(int u,int fa)
{
	vis[u]=true;
	long long ans=1,son=0;
	for(int i=e2.head[u];i;i=e2.e[i].nxt)
	{
		int v=e2.e[i].to;
		if(!vis[v])
		{
			ans=1ll*ans*dfs(v,u)%p;
			son++;
		}
	}
	if(son)
		ans=1ll*ans*son%p;
	return ans;
}
int main()
{
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>c>>T;
	while(T--)
	{
		flag1=flag2=true;
		e1.cnt=e2.cnt=0;
		cin>>n>>k;
		for(int i=1;i<=n;i++)
		{
			e1.head[i]=0,e2.head[i]=0;
		}
		for(int i=1;i<n;i++)
		{
			cin>>u>>v;
			if(u!=i||v!=i+1)flag1=false;
			if(u!=1||v!=i+1)flag2=false;
			e1.add(u,v,i);//注意方向 
			e1.add(v,u,i);
		}
		for(int i=1;i<=k;i++)
		{
			cin>>a[i];
		}
		if(flag1)
		{
			cout<<1<<endl;
			continue;
		}
		/*if(flag2)
		{
			long long ans=k;
			for(int i=1;i<=n-2;i++)
			{
				ans=1ll*ans*i%p;
			}
			cout<<ans<<endl;
			continue;
		}*/
		for(int i=1;i<=e1.cnt;i++)
		{
			int u=e1.e[i].from;
			for(int j=e1.head[u];j;j=e1.e[j].nxt)
			{
				if(i!=j)
					e2.add(e1.e[i].id,e1.e[j].id,0);//注意重复 
			}
			/*int u=e1.e[i].to;
			for(int j=e1.head[u];j;j=e1.e[j].nxt)
			{
				int v=j;
				e2.add(e1.e[i].id,e1.e[j].id);
			}*/
		}
		long long ans=0;
		for(int i=1;i<=k;i++)
		{
			ans=(ans+dfs(a[i],0))%p;
		}
		cout<<ans<<endl;
	}
	return 0;
}
