#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int y,s;
int T,c,n,m;
bool vis[N];
struct node{
	int u,v;
};
vector<node> vv;
vector<int> g[N],tre[N];
vector<vector<node> > t;
int in(){
	int f=1,ans=0;
	char c=getchar();
	while(!isdigit(c)){
		if(c==45)
			f=-1;
		c=getchar();
	}
	while(isdigit(c)){
		ans=ans*10+c-48;
		c=getchar();
	}
	return f*ans;
}
bool cmp(node x,node y){
	if(x.u!=y.u)
		return x.u<y.u;
	return x.v<y.v;
}
void dfs(int x){
	if(s>=n-1){
		sort(vv.begin(),vv.end(),cmp);
		t.push_back(vv);
		return;
	}
	for(int i=0;i<tre[x].size();++i){
		y=tre[x][i];
		if(!vis[y]){
			++s;
			vis[y]=1;
			vv.push_back({min(x,y),max(x,y)});
			dfs(y);
		}
	}
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	c=in(),T=in();
	while(T--){
		n=in(),m=in();
		int u,v;
		for(int i=1;i<n;++i){
			u=in(),v=in();
			g[u].push_back(i);
			g[v].push_back(i);
		}
		for(int i=0;i<n;++i){
			for(int j=0;j<g[i].size();++j)
				for(int k=j+1;k<g[i].size();++k){
					tre[g[i][k]].push_back(g[i][j]);
					tre[g[i][j]].push_back(g[i][k]);
				}
		}
//		for(int i=1;i<n;++i){
//			printf("%d: ",i);
//			for(int j=0;j<tre[i].size();++j)
//				printf("%d ",tre[i][j]);
//			putchar(10);
//		}
		int x;
		for(int i=0;i<m;++i){
			memset(vis,0,sizeof(vis));
			x=in();vv.clear();
			vis[x]=s=1;
			dfs(x);
		}
		printf("%d\n",t.size());
//		for(int i=0;i<t.size();++i){
//			for(int j=0;j<t[i].size();++i)
//				printf("%d %d\n",t[i][j].u,t[i][j].v);
//			putchar(10);
//		}
	}
	return 0;
}
/*

*/

