// Think twice, code once. #include #include #include #include #include #include #define eputchar(c) putc(c, stderr) #define eprintf(...) fprintf(stderr, __VA_ARGS__) #define eputs(str) fputs(str, stderr), putc('\n', stderr) using namespace std; const int mod = 1e9 + 7; int Subtaskid, T; int n, k, d[100005], f[100005], e[100005]; struct graph { int tot, hd[100005]; int nxt[200005], to[200005]; void clear(int n) {tot = 1; memset(hd, 0, sizeof(int) * n); return;} void add(int u, int v) { nxt[++tot] = hd[u]; hd[u] = tot; to[tot] = v; return; } } g; int fac[100005], inv[100005], ifac[100005]; int dp[100005][2], val[100005], ival[100005]; void dfs(int now, int fa) { dp[now][0] = dp[now][1] = 0; val[now] = fac[d[now] - 1], ival[now] = ifac[d[now] - 1]; vector son; son.resize(d[now]); for (int i = g.hd[now]; i; i = g.nxt[i]) if (g.to[i] != fa) { son.push_back(g.to[i]); f[g.to[i]] = e[i / 2]; dfs(g.to[i], now); val[now] = (long long)val[now] * val[g.to[i]] % mod; ival[now] = (long long)ival[now] * ival[g.to[i]] % mod; } for (int v : son) dp[now][0] = (dp[now][0] + (long long)dp[v][0] * val[now] % mod * ival[v] % mod) % mod; { int res = 0, sum = 0; for (int v : son) { res = (res + (long long)dp[v][1] * ival[v] % mod * sum % mod) % mod; sum = (sum + (long long)dp[v][1] * ival[v]) % mod; } res = (long long)res * val[now] % mod * inv[d[now] - 1] % mod; dp[now][0] = (dp[now][0] - res + mod) % mod; } if (f[now]) { int c = (long long)val[now] * inv[d[now] - 1] % mod; for (int v : son) { dp[now][0] = (dp[now][0] - (long long)dp[v][1] * ival[v] % mod * c % mod + mod) % mod; dp[now][1] = (dp[now][1] - (long long)dp[v][1] * ival[v] % mod * c % mod + mod) % mod; } dp[now][0] = (dp[now][0] + val[now]) % mod; dp[now][1] = (dp[now][1] + val[now]) % mod; } { int c = (long long)val[now] * inv[d[now] - 1] % mod; for (int v : son) dp[now][1] = (dp[now][1] + (long long)dp[v][1] * ival[v] % mod * c) % mod; } return; } int main() { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); fac[0] = fac[1] = 1; inv[0] = inv[1] = 1; for (int i = 2; i <= 100000; i++) { fac[i] = (long long)fac[i - 1] * i % mod; inv[i] = (long long)(mod - mod / i) * inv[mod % i] % mod; } ifac[0] = ifac[1] = 1; for (int i = 2; i <= 100000; i++) ifac[i] = (long long)ifac[i - 1] * inv[i] % mod; cin >> Subtaskid >> T; while (T--) { // eprintf("T = %d\n", T); cin >> n >> k; g.clear(n + 5); for (int i = 1; i <= n; i++) d[i] = 0; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; g.add(u, v), g.add(v, u); d[u]++, d[v]++; e[i] = 0; } for (int i = 1; i <= k; i++) { int id; cin >> id; e[id] = 1; } dfs(1, 0); // for (int i = 1; i <= n; i++) // if (f[i]) eprintf("%d %d\n", val[i], dp[i][0]); cout << dp[1][0] << '\n'; } return 0; }