#include<bits/stdc++.h>
using namespace std;
int q,t;
int n,k;
const int N=2e5+10,mod=1e9+7;
int h[N],to[N],ne[N],idx;
void add(int u,int v){
	to[++idx]=v;
	ne[idx]=h[u];
	h[u]=idx;
}
struct ayin{
	int fr,to; 
}a[N];
int c[N];
int sz[N];
template <class T>
inline void read(T& x){
	x=0;
	T f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	x*=f;
}
void dfs(int u,int fa,int kl){
	sz[u]=1;
	for(int i=h[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa||v==a[kl].fr||v==a[kl].to){
			continue;
		}
		dfs(v,u,kl);
		sz[u]+=sz[v];
	}
}
int main(){
	freopen("traverse.in","r",stdin);
	freopen("traverse.out","w",stdout);
	read(q),read(t);
	while(t--){
		read(n),read(k);
		idx=0;
		for(int i=1;i<n;i++){
			read(a[i].fr),read(a[i].to);
			add(a[i].fr,a[i].to);
			add(a[i].to,a[i].fr); 
		}
		int op=0;
		for(int i=1;i<=k;i++){
			read(c[i]);
			dfs(a[c[i]].fr,0,c[i]);
			op=(op+sz[a[c[i]].fr]-1)%mod;
			dfs(a[c[i]].to,0,c[i]);
			op=(op+sz[a[c[i]].to]-1)%mod;
		}
		printf("%d\n",op);
	}
	return 0;
}
/*
1 1
4 1
1 2
2 3
2 4
1

7 1 
5 2 
1 2 
1 3
2 4
2 5
1 3
*/

