#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll; typedef double lf; typedef unsigned long long ull; namespace FastIO { const int MAXSIZE = (1 << 20); char buf[MAXSIZE], *p1, *p2; #define gc (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) ? EOF : *p1++) template inline void Read(T &x) { x = 0; char ch = gc; bool f = 0; while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = gc; } while (ch >= '0' && ch <= '9') x = x * 10 + (ch ^ 48), ch = gc; if (f) x = -x; } } using FastIO::Read; using namespace std; const int MAXN = 1e5 + 10, mod = 1e9 + 7; ll fac[MAXN]; int n, m, key[MAXN]; struct Edge { int u, v; }gg[MAXN]; vector e[MAXN]; bool avl[MAXN]; int dep[MAXN]; ll val[MAXN], oval[MAXN]; void DFS1(int u, int fa) { dep[u] = dep[fa] + 1; val[u] = (e[u].size() > 1 ? e[u].size() - 1 : 1); for (auto v : e[u]) if (v != fa) oval[v] = val[u], DFS1(v, u), val[u] = val[u] * val[v] % mod; } void DFS3(int u, int fa) { ll sum = 1; for (int i = e[u].size() - 1; ~i; i--) { int v = e[u][i]; if (v == fa) continue; oval[v] = oval[v] * sum % mod * oval[u] % mod; sum = sum * val[v] % mod; DFS3(v, u); } } ll f[MAXN][2], ans, res[2]; void DFS2(int u, int fa) { f[u][0] = f[u][1] = 0; if (u != 1 && e[u].size() == 1) { f[u][avl[u]] = 1; return ; } for (auto v : e[u]) if (v != fa) DFS2(v, u); ll sum = 1; res[0] = res[1] = 0; for (auto v : e[u]) { if (v == fa) continue; res[0] = (val[v] * res[0] + f[v][0] * f[u][0]) % mod; res[1] = (val[v] * res[1] + f[v][0] * f[u][1] + f[v][1] * f[u][0] + f[v][1] * f[u][1]) % mod; f[u][0] = (val[v] * f[u][0] + f[v][0] * sum) % mod; f[u][1] = (val[v] * f[u][1] + f[v][1] * sum) % mod; sum = sum * val[v] % mod; // cout << u << ' ' << v << ' ' << f[u][0] << ' ' << f[u][1] << ' ' << res[0] << ' ' << res[1] << ' ' << sum << '\n'; } ans = (ans + res[1] * oval[u]) % mod; if (u == 1 && e[u].size() == 1) ans = (ans + f[u][1]) % mod; // cout << u << ' ' << ans << '\n'; if (avl[u]) f[u][1] = (f[u][1] + f[u][0]) % mod, f[u][0] = 0; } int main() { // freopen("day0/traverse/traverse4.in", "r", stdin); freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); ios::sync_with_stdio(0), cin.tie(0); fac[0] = 1; for (int i = 1; i < MAXN; i++) fac[i] = fac[i - 1] * i % mod; int Case, T; Read(Case), Read(T); int tt = 0; while (T--) { Read(n), Read(m); for (int i = 1; i <= n; i++) { e[i].clear(); avl[i] = 0; val[i] = oval[i] = 0; } for (int i = 1, x, y; i < n; i++) Read(x), Read(y), e[x].emplace_back(y), e[y].emplace_back(x), gg[i] = {x, y}; for (int i = 1; i <= m; i++) Read(key[i]); tt++; if (n == 2) { cout << "1\n"; continue; } DFS1(1, 0); for (int i = 1; i <= m; i++) { int u = key[i]; if (dep[gg[u].u] > dep[gg[u].v]) avl[gg[u].u] = 1; else avl[gg[u].v] = 1; } oval[1] = 1; DFS3(1, 0); // for (int i = 1; i <= n; i++) cout << oval[i] << ' '; cout << "\n"; ans = 0, DFS2(1, 0); for (int i = 1; i <= n; i++) if (e[i].size() > 2) ans = ans * fac[e[i].size() - 2] % mod; cout << ans << '\n'; } return 0; }