#include<bits/stdc++.h>
using namespace std;
#define mod int(1e9+7)
const int N=550;
int c,t;
int n,k,m;
//vector<vector<int>> a(N);
int a[N][N];
struct stu{
	int u,v;
}edge[N];
set<int> s;
bool check(int i,int j){
	if(edge[i].u==edge[j].u||edge[i].v==edge[j].u||edge[i].v==edge[j].v||edge[i].u==edge[j].v) return true;
	return false;
}
int d[N];//每个点的度数 
int ans;

bool cc(){
	set<int> id;
	for(int i=1;i<=n;i++){
		if(d[i]==2) id.insert(i);
	}
	for(auto v:id){
		if(s.find(v)!=s.end()) return true;
	}
	return false;
	
}
int main()
{
  	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	cin>>c>>t;
	while(t--){
		scanf("%d%d",&n,&k);
		m=n-1;
	
		for(int i=1;i<=m;i++){//将图重构成一个关于边的图 问以关键边为根 可以产生多少种不同的树
		
			int u,v;
			scanf("%d%d",&edge[i].u,&edge[i].v);
			d[edge[i].u]++;
			d[edge[i].v]++;
		}
		for(int i=1;i<=m;i++){
			for(int j=i+1;j<=m;j++){
				if(check(i,j)/*这两条边相邻*/){
					a[i][j]=a[j][i]=1;
				}
			}
		}
		s.clear();
		for(int i=1;i<=k;i++){
			int x;
			scanf("%d",&x);
			s.insert(x);
		}
		//遍历所有边 一个一个试着删除 
		for(int i=1;i<=m;i++){
			for(int j=i+1;j<=m;j++){
				if(a[i][j]==1||a[j][i]==1){
					d[i]--;
					d[j]--;
					if(cc()){
						ans+=1;
						ans%=mod;
					}
					d[i]++;
					d[j]++;
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

