#include <bits/stdc++.h>
using namespace std;
long long n, q, k, m, r, h[100005];
long long head[100005], idx;
struct edge {
  long long v, next;
} e[100005 << 1];
void addedge(long long u, long long v) {
  e[++idx].v = v;
  e[idx].next = head[u];
  head[u] = idx;
}
long long top[100005], son[100005], size[100005], seg[100005], rev[100005],
    fa[100005], dep[100005], num;
long long c[100005], cnt[100005];
bool cmp(long long x, long long y) { return cnt[x] < cnt[y]; }
void dfs1(long long x, long long f) {
  fa[x] = f;
  size[x] = 1;
  dep[x] = dep[f] + 1;
  for (long long i = head[x]; i; i = e[i].next) {
    long long y = e[i].v;
    if (y == f) continue;
    dfs1(y, x);
    size[x] += size[y];
    if (size[y] > size[son[x]]) son[x] = y;
  }
}
void dfs2(long long x) {
  if (x == son[fa[x]])
    top[x] = top[fa[x]];
  else
    top[x] = x;
  seg[x] = ++num;
  rev[num] = x;
  if (son[x]) dfs2(son[x]);
  for (long long i = head[x]; i; i = e[i].next) {
    long long y = e[i].v;
    if (y == fa[x] || y == son[x]) continue;
    dfs2(y);
  }
}
void add(long long x, long long v) {
  for (; x <= n; x += (x & (-x))) c[x] += v;
}
long long ask(long long x) {
  long long ans = 0;
  for (; x; x -= (x & (-x))) ans += c[x];
  return ans;
}
long long getdis(long long x, long long y) {
  long long ans = 0;
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    ans += ask(seg[x]) - ask(seg[top[x]] - 1);
    x = fa[top[x]];
  }
  if (dep[x] > dep[y]) swap(x, y);
  ans += ask(seg[y]) - ask(seg[x] - 1);
  return ans;
}
long long f[100005][305];
signed main() {
  scanf("%lld%lld", &n, &q);
  for (long long i = 1; i < n; i++) {
    long long u, v;
    scanf("%lld%lld", &u, &v);
    addedge(u, v);
    addedge(v, u);
  }
  dfs1(1, 0);
  dfs2(1);
  while (q--) {
    scanf("%lld%lld%lld", &k, &m, &r);
    for (long long i = 1; i <= k; i++) scanf("%lld", &h[i]), add(seg[h[i]], 1);
    for (long long i = 1; i <= k; i++) cnt[h[i]] = getdis(h[i], r) - 1;
    sort(h + 1, h + k + 1, cmp);
    f[0][0] = 1;
    for (long long i = 1; i <= k; ++i) {
      for (long long j = 1; j <= min(i, m); ++j) {
        if (j < cnt[h[i]])
          f[i][j] = f[i - 1][j - 1];
        else
          f[i][j] =
              (f[i - 1][j - 1] + f[i - 1][j] * (j - cnt[h[i]]) % 1000000007) %
              1000000007;
      }
    }
    long long ans = 0;
    for (long long i = 1; i <= m; ++i) ans = (ans + f[k][i]) % 1000000007;
    printf("%lld\n", ans);
    for (long long i = 1; i <= k; ++i) add(seg[h[i]], -1);
    for (long long i = 1; i <= k; ++i)
      for (long long j = 1; j <= min(i, m); ++j) f[i][j] = 0;
  }
  return 0;
}
