#include<bits/stdc++.h>
#define int long long
using namespace std;	
const int N=1e5+5;
int id,T,n,s,x,ans,cnt;
int a[N],b[N];
vector<int>g[N];
bitset<N>vis;
struct AB{
	int a,b,n;
}d[N*2];
void cun(int a,int b){
	g[a].push_back(b);
}
bool check(int x,int y){
	if(a[x]==a[y] || a[x]==b[y]) return 1;
	if(b[x]==a[y] || b[x]==b[y]) return 1;
	return 0;
} 
void dfs(int u){
	vis[u]=1;
	if((int)vis.count()==n-1){
		ans++;
		vis[u]=0;
		return;
	} 
	for(int i=0; i<(int)g[u].size(); i++){
		int v=g[u][i];
		if(vis[v]) continue;
		dfs(v);
	}
	vis[u]=0;
}
void solve(){
	scanf("%lld%lld",&n,&s);
	for(int i=1; i<n; i++){
		scanf("%lld%lld",&a[i],&b[i]);
	}
	for(int i=1; i<n; i++) g[i].clear();
	for(int i=1; i<n; i++){
		for(int j=1; j<i; j++){
			if(check(i,j)){
				cnt++;
				cun(i,j),cun(j,i);
			} 
		}
	}
	ans=0;
	for(int i=1; i<=s; i++){
		scanf("%lld",&x);
		for(int j=1; j<n; j++) vis[j]=0;
		dfs(x);
	}
	printf("%lld\n",ans);
}
signed main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	scanf("%lld%lld",&id,&T);
	while(T--) solve();
	return 0;
}

