#include<bits/stdc++.h>
using namespace std;

int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-')	
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
} 

struct edge{
	int to,next;
}e[200005];

int cnt=1;
int head[100005];

void add(int u,int v){
	cnt++;
	e[cnt]={v,head[u]};
	head[u]=cnt;	
}

vector<int> node[100005];
int n,k,ans;
bool vis[100005];

void cal(int a,int sum){
	if(sum==n-1){
		ans++;
		return;
	}
	vis[a]=true;
	for(int i=head[a];i;i=e[i].next){
		int t=e[i].to;
		if(!vis[t]){
			cal(t,sum+1);
		}
	}	
	vis[a]=false;
}

int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c=read(),T=read();
	while(T--){
		n=read(),k=read();
		for(int i=1;i<=n-1;i++){
			int u=read(),v=read();
			node[u].push_back(i);
			node[v].push_back(i);
		}
		for(int i=1;i<=n;i++){
			for(int j=0;j<node[i].size();j++)
				for(int k=0;k<node[i].size();k++)
					if(j!=k)
						add(node[i][j],node[i][k]);
		}
		for(int i=1;i<=k;i++)
			int tmp=read();
		cal(1,1);
		printf("%d\n",ans);
	}
	return 0;
}
