#include #include #include #include #include typedef long long ll; const ll N = 1e5; const ll mod = 1e9 + 7; char ibuf[1 << 23], *p1 = ibuf, *p2 = ibuf; #define gc() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, 1 << 23, stdin), p1 == p2) ? EOF : *p1 ++ ) inline int read() { bool f = 0; ll x = 0; char c; while (!isdigit(c = gc())) if (c == '-') f = 1; do x = 10 * x + c - '0'; while (isdigit(c = gc())); return f ? -x : x; } ll fact[N + 5]; inline void init() {fact[0] = 1; for (ll i = 1; i <= N; i ++ ) fact[i] = fact[i - 1] * i % mod;} ll d[N + 5]; struct edge { ll v, w, ne; } e[2 * N + 5]; ll h[N + 5], idx; inline void connect(ll u, ll v, ll w) {e[idx] = edge{v, w, h[u]}, h[u] = idx ++ ;} bool st[N + 5]; ll dp[N + 5][2][2]; void dfs(ll u, ll fa) { ll hy[3][2][3], xj[3][2][3]; std :: memset(hy, 0, sizeof hy), std :: memset(xj, 0, sizeof xj); xj[0][0][1] = 1; xj[0][0][2] = 1; xj[0][1][0] = 1; xj[0][1][1] = 1; for (ll i = h[u]; ~i; i = e[i].ne) { ll v = e[i].v, w = e[i].w; if (v == fa) continue; dfs(v, u); hy[0][0][1] = (xj[0][0][1] * dp[v][1][0]) % mod; hy[1][0][1] = (xj[1][0][1] * dp[v][1][0] + xj[0][0][1] * (dp[v][0][1] - st[w] * (dp[v][1][1] + dp[v][1][0]) % mod + mod)) % mod; hy[0][0][2] = (xj[0][0][2] * dp[v][1][0]) % mod; hy[1][0][2] = (xj[1][0][2] * dp[v][1][0] + xj[0][0][2] * (dp[v][1][1] - st[w] * (dp[v][1][1] + dp[v][1][0]) % mod + mod)) % mod; hy[2][0][2] = (xj[2][0][2] * dp[v][1][0] + xj[1][0][2] * (dp[v][1][1] - st[w] * (dp[v][1][1] + dp[v][1][0]) % mod + mod)) % mod; hy[0][1][0] = (xj[0][1][0] * dp[v][1][0]) % mod; hy[0][1][1] = (xj[0][1][1] * dp[v][1][0]) % mod; hy[1][1][1] = (xj[1][1][1] * dp[v][1][0] + xj[0][1][1] * (dp[v][1][1] - st[w] * (dp[v][1][1] + dp[v][1][0]) % mod + mod)) % mod; xj[0][0][1] = hy[0][0][1]; xj[1][0][1] = hy[1][0][1]; xj[0][0][2] = hy[0][0][2]; xj[1][0][2] = hy[1][0][2]; xj[2][0][2] = hy[2][0][2]; xj[0][1][0] = hy[0][1][0]; xj[0][1][1] = hy[0][1][1]; xj[1][1][1] = hy[1][1][1]; } dp[u][0][1] = (xj[1][0][1] * fact[d[u] - 1] + xj[2][0][2] * fact[d[u] - 2]) % mod; dp[u][1][0] = xj[0][1][0] * fact[d[u] - 1] % mod; dp[u][1][1] = xj[1][1][1] * fact[d[u] - 2] % mod; } inline void solve() { ll n = read(), k = read(); std :: memset(h, -1, sizeof h), idx = 0; std :: memset(d, 0, sizeof d); for (ll i = 1; i < n; i ++ ) { ll u = read(), v = read(); connect(u, v, i), connect(v, u, i); d[u] ++ , d[v] ++ ; } std :: memset(st, 0, sizeof st); for (ll i = 1; i <= k; i ++ ) st[read()] = 1; dfs(1, 0); printf("%lld\n", (mod - dp[1][0][1]) % mod); } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #else freopen("traverse.in", "r", stdin); freopen("traverse.out", "w", stdout); #endif init(); read(); ll T = read(); while (T -- ) solve(); return 0; }