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

#define ll long long

const int N=1e6+10;
const int mod=1e9+7;

int n,k,ans;
struct EDGE
{
	int u,v;
}E[N];
struct edge
{
	int u,v,nxt;
}e[N<<1];
int head[N],tot;
void add(int u,int v)
{
	e[++tot]=edge{u,v,head[u]};
	head[u]=tot;
}
int s;

int vis[N];
int chk()
{
	for(int i=1;i<n;i++)
		if(!vis[i]) return 0;
	return 1;
}
set<int> st;
map<set<int>,int> mp;
void dfs(int u,int f)
{
	if(chk())
	{
		if(!mp[st]) ans++;
		mp[st]=1;
		return ;
	}
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==f||vis[v]) continue;
		st.insert(i),st.insert(i^1);
		vis[v]=1;
		dfs(v,u);
		vis[v]=0;
		
	}
}

void work()
{
	memset(head,0,sizeof(head)),tot=1,ans=0;
	st.clear(),mp.clear();
	scanf("%d%d",&n,&k);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&E[i].u,&E[i].v);
		for(int j=1;j<i;j++)
			if(E[i].u==E[j].u||E[i].v==E[j].v||E[i].u==E[j].v||E[i].v==E[j].u) add(i,j),add(j,i);
	}
	for(int i=1;i<=k;i++)
	{
		scanf("%d",&s);
		vis[s]=1,dfs(s,0),vis[s]=0;
	}
	printf("%d\n",ans);
}

int main()
{
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	int c,T;scanf("%d%d",&c,&T);
	if(c==18)
	{
		while(T--) printf("1\n");
		return 0;
	}
	while(T--) work();
	return 0;
}
