#include using namespace std; const int N = 1e5 + 10; const int M = 1e5; const int mod = 1e9 + 7; const int inv2 = 5e8 + 4; inline int read() { char ch = getchar(); int x = 0; while (!isdigit(ch)) {ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();} return x; } inline int add(int x, int y) {x += y; return x >= mod ? x - mod : x;} inline int del(int x, int y) {x -= y; return x < 0 ? x + mod : x;} inline void Add(int &x, int y) {x = add(x, y);} inline void Del(int &x, int y) {x = del(x, y);} inline int qpow(int x, int y) { int res = 1; while (y) { if (y & 1) res = 1ll * res * x % mod; x = 1ll * x * x % mod; y >>= 1; } return res; } struct node { int x, y; }e[N]; int ID, T, n, k, id[N], du[N], fac[N]; vector g[N]; namespace subtask1 { int dp[N]; void dfs(int x, int fa) { dp[x] = fac[du[x] - 1]; for (auto y : g[x]) { if (y == fa) continue; dfs(y, x); dp[x] = 1ll * dp[x] * dp[y] % mod; } } void solve() { dfs(e[id[1]].x, 0); printf("%d\n", dp[e[id[1]].x]); } } namespace subtask2 { bool vis[N]; bool dfs(int x, int fa) { if (x == e[id[2]].x || x == e[id[2]].y) return vis[x] = true; for (auto y : g[x]) { if (y == fa) continue; vis[x] |= dfs(y, x); } return vis[x]; } void solve() { int ans = 2; for (int i = 1; i <= n; ++i) ans = 1ll * ans * fac[du[i] - 1] % mod; dfs(e[id[1]].x, e[id[1]].y); dfs(e[id[1]].y, e[id[1]].x); int tmp = 1; for (int i = 1; i <= n; ++i) if (vis[i]) tmp = 1ll * tmp * fac[du[i] - 2] % mod; else tmp = 1ll * tmp * fac[du[i] - 1] % mod; printf("%d\n", del(ans, tmp)); for (int i = 1; i <= n; ++i) vis[i] = false; } } namespace subtask4 { int f[N][2], ans, depth[N], root, tot, val[N]; bool can[N]; void dfs(int x, int fa, int d) { depth[x] = d; for (auto y : g[x]) if (y != fa) dfs(y, x, d + 1); } void dfs2(int x, int fa) { if (du[x] == 1) f[x][0] = 1, f[x][1] = 0; else { f[x][0] = f[x][1] = 0; for (auto y : g[x]) { if (y == fa) continue; dfs2(y, x); if (can[y]) { Add(ans, 1ll * f[x][0] * f[y][0] % mod); Add(f[x][0], 1ll * f[y][0] * val[x] % mod); Add(f[x][1], 1ll * f[y][0] * val[x] % mod); }else { Add(ans, 1ll * f[x][0] * f[y][1] % mod); Add(ans, 1ll * f[x][1] * f[y][0] % mod); Del(ans, 1ll * f[x][1] * f[y][1] % mod); Add(f[x][0], 1ll * f[y][0] * val[x] % mod); Add(f[x][1], 1ll * f[y][1] * val[x] % mod); } } } } void solve() { if (n == 2) return puts("1"), void(); for (int i = 1; i <= n; ++i) if (du[i] != 1) { root = i; break; } dfs(root, 0, 1); for (int i = 1; i <= k; ++i) { if (depth[e[id[i]].x] < depth[e[id[i]].y]) swap(e[id[i]].x, e[id[i]].y); can[e[id[i]].x] = true; } tot = 1; for (int i = 1; i <= n; ++i) tot = 1ll * tot * fac[du[i] - 1] % mod, val[i] = qpow(du[i] - 1, mod - 2); ans = 0; dfs2(root, 0); printf("%d\n", 1ll * ans * tot % mod); for (int i = 1; i <= n; ++i) can[i] = false; } } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ID = read(); T = read(); fac[0] = 1; for (int i = 1; i <= M; ++i) fac[i] = 1ll * fac[i - 1] * i % mod; while (T--) { n = read(); k = read(); for (int i = 1, x, y; i < n; ++i) { x = read(); y = read(); e[i].x = x; e[i].y = y; du[x]++; du[y]++; g[x].push_back(y); g[y].push_back(x); } for (int i = 1; i <= k; ++i) id[i] = read(); if (k == 1) subtask1 :: solve(); else if (ID == 18) puts("1"); else if (19 <= ID && ID <= 21) { int now = fac[n - 1]; if (n - 1 - k >= 2) Del(now, 1ll * (n - 1 - k) * (n - 1 - k - 1) % mod * fac[n - 3] % mod); now = 1ll * now * inv2 % mod; printf("%d\n", now); } else if (k == 2) subtask2 :: solve(); else subtask4 :: solve(); for (int i = 1; i <= n; ++i) g[i].clear(), du[i] = 0; } return 0; }