#include #include using namespace std; typedef long long ll; template T read() { char c = getchar(); int x = 0; bool f = 0; while (c < 48 or c > 57) f |= (c == '-'), c = getchar(); do x = (x * 10) + (c ^ 48), c = getchar(); while (c >= 48 and c <= 57); return f ? -x : x; } const int N = 100003, P = 1000000007; int n, k; bool key[N]; int f[N][2][2][2], fac[N], d[N]; int hd[N], ver[N << 1], nxt[N << 1], tot; void add(int u, int v) { nxt[++tot] = hd[u], hd[u] = tot, ver[tot] = v; } inline void inc(int &x, int v) { if ((x += v) >= P) x -= P; } void dfs(int u, int fa) { if (d[u] == 1) { memset(f[u], 0, sizeof f[u]); f[u][1][1][0] = 1; } else { int w[3][2][2]; memset(w, 0, sizeof w); w[0][1][0] = 1; for (int i = hd[u]; i; i = nxt[i]) { int v = ver[i]; if (v == fa) continue; dfs(v, u); inc(f[v][0][1][key[i >> 1]], f[v][1][1][0]); inc(f[v][0][0][1], f[v][1][0][1]); inc(f[v][0][1][1], f[v][1][1][1]); int nw[3][2][2]; memset(nw, 0, sizeof nw); for (int x = 0; x <= 2; ++x) for (int a = 0; a < 2; ++a) for (int b = 0; b < 2; ++b) { int v0 = w[x][a][b]; if (!v0) continue; for (int A = 0; A < 2; ++A) for (int B = 0; B < 2; ++B) for (int C = 0; C < 2; ++C) { int v1 = f[v][A ^ 1][B][C]; if (!v1 or x + A > 2) continue; inc(nw[x + A][a & B][(b & B) | (a & C & A)], (ll)v0 * v1 % P); } } memcpy(w, nw, sizeof nw); } for (int x = 0; x < 2; ++x) for (int a = 0; a < 2; ++a) for (int b = 0; b < 2; ++b) f[u][x][a][b] = w[2 - x][a][b]; inc(f[u][0][0][0], f[u][0][1][0]); inc(f[u][0][0][1], f[u][0][1][1]); f[u][0][1][0] = f[u][0][1][1] = f[u][0][0][0] = f[u][1][0][0] = 0; } } void solve() { n = read(), k = read(), tot = 1; fac[0] = 1; for (int i = 1; i < n; ++i) { int u = read(), v = read(); add(u, v), add(v, u); ++d[u], ++d[v]; key[i] = 0; fac[i] = (ll)fac[i - 1] * i % P; } for (int i = 1; i <= k; ++i) key[read()] = 1; if (n == 2) puts("1"); else { int rt = 1; while (d[rt] == 1) ++rt; dfs(rt, 0); int res = f[rt][0][0][1]; for (int i = 1; i <= n; ++i) if (d[i] > 1) res = (ll)res * fac[d[i] - 2] % P; printf("%d\n", res); } while (tot) ver[tot] = nxt[tot] = 0, --tot; for (int i = 1; i <= n; ++i) hd[i] = 0, d[i] = 0; } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); read(); int tc = read(); while (tc--) solve(); return 0; }