#include using namespace std; namespace QYB { using ll = long long; const int P = 1000000007; struct edge { int to, nxt; bool flag; } e[200005]; int n, m, tot, u[100005], v[100005], head[100005]; int d[100005], fact[100005], f[100005][2], g[100005][2]; char getchar() { static char buf[1 << 25], *p1 = buf, *p2 = buf; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 25, stdin)) == buf? EOF: *p1++; } int read() { int res = 0; char ch = getchar(); while (ch < 48 || ch > 57) ch = getchar(); while (ch >= 48 && ch <= 57) res = res * 10 + ch - 48, ch = getchar(); return res; } void clear() { for (int i = 1; i <= n; i++) { head[i] = d[i] = 0; } tot = 0; } void addedge(int u, int v, bool f) { e[++tot] = {v, head[u], f}; head[u] = tot; ++d[u]; } void dfs(int cur, int fr) { f[cur][0] = f[cur][1] = g[cur][1] = 0; g[cur][0] = 1; bool is_first = true; int tmp = 1; for (int i = head[cur]; i; i = e[i].nxt) { int to = e[i].to; if (to == fr) continue; dfs(to, cur); int ng0 = ((ll)g[cur][0] * (g[to][0] + g[to][1]) * !is_first % P + (ll)tmp * (e[i].flag? 0: g[to][0]) % P) % P; int ng1 = ((ll)g[cur][1] * (g[to][0] + g[to][1]) % P + (ll)tmp * ((e[i].flag? g[to][0]: 0) + g[to][1]) % P) % P; int nf0 = ((ll)(f[cur][0] + f[cur][1]) * (g[to][0] + g[to][1]) % P + (ll)(g[cur][0] + g[cur][1]) * (f[to][0] + f[to][1]) * !is_first % P + (ll)((ll)g[cur][0] * ((e[i].flag? g[to][0]: 0) + g[to][1]) % P + (ll)g[cur][1] * (g[to][0] + g[to][1]) % P) * !is_first) % P; int nf1 = ((ll)f[cur][1] * (g[to][0] + g[to][1]) % P + (ll)tmp * (f[to][0] + f[to][1]) % P) % P; g[cur][0] = ng0; g[cur][1] = ng1; f[cur][0] = nf0; f[cur][1] = nf1; tmp = (ll)tmp * (g[to][0] + g[to][1]) % P; is_first = false; } } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); fact[0] = 1; for (int i = 1; i <= 100000; i++) { fact[i] = (ll)fact[i - 1] * i % P; } for (int T = (read(), read()); T; T--) { clear(); n = read(); m = read(); for (int i = 1; i <= n - 1; i++) { u[i] = read(); v[i] = read(); } for (int i = 1; i <= m; i++) { int x = read(); if (u[x] > 0) u[x] = -u[x]; } for (int i = 1; i <= n - 1; i++) { if (u[i] < 0) addedge(-u[i], v[i], true), addedge(v[i], -u[i], true); else addedge(u[i], v[i], false), addedge(v[i], u[i], false); } dfs(1, 0); int ans = (f[1][0] + (d[1] == 1) * (f[1][1] + g[1][1]) % P) % P; for (int i = 1; i <= n; i++) ans = (ll)ans * fact[max(d[i] - 2, 0)] % P; printf("%d\n", ans); } return 0; } } int main() { return QYB::main(); }