#include #define ALL(v) begin(v), end(v) using i64 = int64_t; const int kMaxN = 1E5 + 5, kMod = 1E9 + 7; void Add(int &x, int y) { if ((x += y) >= kMod) x -= kMod; } auto Sum(int x, int y) { return Add(x, y), x; } auto Neg(int x) { return Sum(kMod, -x); } auto Power(int a, int b, int p = kMod) { int r = 1; for (; b; b >>= 1, a = i64{a} * a % p) { if (b & 1) r = i64{r} * a % p; } return r; } auto Inv(int a, int p = kMod) { return Power(a, p - 2, p); } std::array fac, inv; void Math() { for (int i = fac[0] = 1; i < kMaxN; ++i) { fac[i] = i64{fac[i - 1]} * i % kMod; } for (int i = 1; i < kMaxN; ++i) inv[i] = Inv(i); } int n, k, ans; std::array, kMaxN> adj, adj2; std::array u, v, e, deg, cnt, val; std::array ban; void Emplace(int u) { if (cnt[u]) Add(ans, Neg(i64{cnt[u]} * val[u] % kMod)); ++cnt[u]; } std::array vis; std::array vl, iv, siz; void Dfs(int u, int fa) { vis[u] = true; if (deg[u] > 1) { vl[u] = i64{vl[fa]} * val[u] % kMod; iv[u] = i64{iv[fa]} * (deg[u] - 1) % kMod; } else { vl[u] = vl[fa], iv[u] = iv[fa]; } siz[u] = i64{cnt[u]} * vl[u] % kMod; for (int v : adj2[u]) { if (v == fa) continue; Dfs(v, u); Add(ans, Neg(i64{siz[u]} * siz[v] % kMod * iv[fa] % kMod * iv[u] % kMod)); Add(siz[u], siz[v]); } } void Proc() { std::cin >> n >> k, ans = k; for (int i = 1; i <= n; ++i) adj[i].clear(), ban[i] = false, deg[i] = cnt[i] = 0, adj2[i].clear(); for (int i = 1; i < n; ++i) { std::cin >> u[i] >> v[i], ++deg[u[i]], ++deg[v[i]]; adj[u[i]].emplace_back(v[i]); adj[v[i]].emplace_back(u[i]); } for (int i = 1; i <= n; ++i) val[i] = inv[deg[i] - 1]; for (int i = 1; i <= k; ++i) { std::cin >> e[i], ban[e[i]] = true; } for (int i = 1; i < n; ++i) { if (!ban[i]) adj2[u[i]].emplace_back(v[i]), adj2[v[i]].emplace_back(u[i]); } for (int i = 1; i <= k; ++i) Emplace(u[e[i]]), Emplace(v[e[i]]); for (int i = 1; i <= n; ++i) vis[i] = false; vl[0] = iv[0] = 1; for (int i = 1; i <= n; ++i) { if (!vis[i]) Dfs(i, 0); } for (int i = 1; i <= n; ++i) ans = i64{ans} * fac[deg[i] - 1] % kMod; std::cout << ans << '\n'; } auto main() -> int { freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); std::ios::sync_with_stdio(false); std::cin.tie(nullptr), std::cout.tie(nullptr); Math(); int c, t; for (std::cin >> c >> t; t; --t) Proc(); return 0; }