#include<bits/stdc++.h>
#define int long long
// #define DEBUG
#define eb emplace_back
using namespace std;
int C;
int T = 1;
using pii = pair<int, int>;
#define mp make_pair
const int P = 1e9 + 7;
namespace azus{
	int n, k;
	int jc[100005];
	vector<pii> edge[100005];
	int c[100005];
	int prework(){
		jc[0] = 1;
		for(int i = 1; i <= n; i ++)
			jc[i] = jc[i - 1] * i % P;
		return 0;
	}
	int du[100005];
	namespace solve1{
		int dep[100005];
		int dfs(int u, int fa){
			dep[u] = dep[fa] + 1;
			for(auto [v, id] : edge[u]){
				if(v != fa) dfs(v, u);
			}
			return 0;
		}
		int mian(){
			for(int i = 1; i <= n; i ++){
				du[i] = edge[i].size();
			}
			int ans = 1;
			for(int i = 1; i <= n; i ++)
				for(auto [j, id] : edge[i])
					if(i < j && id == c[1]){
						dep[i] = 0, dep[j] = 0;
						dfs(i, 0); dfs(j, 0);
					}
			for(int i = 1; i <= n; i ++){
				for(auto [j, id] : edge[i]){
					if(i > j) continue;
					if(id == c[1]){
						(ans *= (jc[du[i] - 1] * jc[du[j] - 1]) % P) %= P;
					}
					else{
						if(dep[i] < dep[j]) (ans *= jc[du[j] - 1]) %= P;
						else (ans *= jc[du[i] - 1]) %= P;
					}
				}
			}
			cout << ans << "\n";
			return 0;
		}
	}
	namespace solve2{
		int mian(){
			cout << 1 << "\n";
			return 0;
		}
	}
	namespace solve3{
		int mian(){
			int ans = 0;
			for(int i = 1; i <= k; i ++){
				ans += (P + jc[n - 2] - (i - 1) * jc[n - 3] % P) % P;
				ans %= P;
			}
			cout << ans << "\n";
			return 0;
		}
	}
	int main(){
		for(int i = 1; i <= n; i ++) edge[i].clear();
		cin >> n >> k;
		prework();
		// for(int i = 1; i <= n; i ++) cout << jc[i] << " ";
		// 	cout << "\n";
		for(int i = 1, u, v; i < n; i ++){
			cin >> u >> v;
			edge[u].eb(mp(v, i)); edge[v].eb(mp(u, i));
		}
		for(int i = 1; i <= k; i ++) cin >> c[i];
		if(C == 18) return solve2::mian(), 0;
		if(C >= 19 && C <= 21) return solve3::mian(), 0;
		if(C <= 25) return solve1::mian(), 0;
		cout << "Wo Shi Nai Long";
		return 0;
	}
}
signed main(){
#ifndef DEBUG
	freopen("traverse.in", "r", stdin);
	freopen("traverse.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
#endif
	cin >> C >> T;
	while(T --){
		azus::main();
	}
	return 0;
}
/*
9:52:43 开题。
我真的纯乃龙。虽然思考了半天 D 暴力，但是 C 的 40 分暴力我怎么写了快 2h
我就是奶龙，我就是奶龙，这下真的只能退役了
我宣布，luogu uid 61158 就是奶龙！！！！！！！！！！！！！！！
啊考前一天立下 flag 如果纸盒和 tder 考的比比我高要请他们吃外卖来着
啊啊啊我的钱包……
写 D 暴力了
最后一次 noip 只能以 100 + 100 + 40 + 32 收尾了吗
好不甘心，好难受，心态有点崩溃。
不管，最后一小时写完 D 暴力就行。
这么顺利的前两个提被 C 暴力毁了。
//freoepn 上述是奶龙内容
12:53:49 结束了，最后一次 noip。
之后不确定能不能去 WC。APIO 肯定会去打。
不过我是高二老灯了，这也没办法了吧。
包拿不到两倍对线内的。复课文化课了。之后可能晚上去机房或者只有周末再学学了。省选会去考，不过希望不大。
subetewo owari.
AzusidNya. 2024/11/30

12:26
我回来了。因为 D 32 分暴力 20 分钟写完了。
再看看还有没有能打的部分分。
现在能做的有什么？
k = 1，链，菊花。
共有 40 分。
所以我想要什么？
k = 2。看看能不能转化上把。
最后还有 15 分钟的时候跑虚拟机。
应该是，在一些情况的时候答案和 k = 1 一样
否则不同。
这里的一些情况是什么啊
我找不到条件了。以我的实力应该不足以在 20 分钟内再拿下这题多少分了。
现在要干什么？看看 D 把。
*/