#include<stdio.h>
#include<iostream>
using namespace std;
int n,e[600000][2],a[500002],head[500002]={0},tot=0;
struct node
{
	int nxt,to;
}s[500002];
long long M=1000000007,ans=0,sum=0;
bool flag[500001];
void add(int i,int j)
{
	tot++;
	s[tot].to=j;
	s[tot].nxt=head[i];
	head[i]=tot;
}
void dfs(int k)
{
	flag[k]=1;
	sum++;
	for(int i=head[k];i;i=s[i].nxt)
	{
		if(flag[s[i].to])continue;
		dfs(s[i].to);
	}
	if(sum==n-1)ans++; 
}
int main()
{
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c,t;
	long long k;
	cin>>c>>t;
	while(t--)
	{
		ans=0;
		scanf("%d%d",&n,&k);
		for(int i=0;i<=n;i++)head[i]=0,flag[i]=0;
		for(int i=1;i<n;i++)
			scanf("%d%d",&e[i][0],&e[i][1]);
		for(int i=0;i<k;i++)scanf("%d",&a[i]);
		if(c==18)cout<<1<<"\n";
		if(c>18&&c<22)
		{
			long long op=1;
			for(int i=1;i<n-2;i++)op=op*i%M;
			long long op1=op*(n-2)%M,kk=k;
			cout<<((op1*k%M-op*(((kk-1)*kk/2)%M))%M+M)%M<<"\n";
		}
		if(c<4)
		{
			for(int i=1;i<n;i++)
				for(int j=0;j<i;j++)
					if(e[i][0]==e[j][0]||e[i][0]==e[j][1]||e[i][1]==e[j][0]||e[j][1]==e[i][1])add(i,j),add(j,i);
			dfs(a[0]);
			cout<<ans<<"\n";
		}
	}
	return 0;
}

