#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
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;
}