#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 100007, _v = 303, mo = 1000000007;
template <typename T1, typename T2>
inline T1 ad(T1 &a, T2 b) {
  return a = a + b >= mo ? a + b - mo : a + b;
}
template <typename T1, typename T2>
inline T1 dl(T1 &a, T2 b) {
  return a = a >= b ? a - b : a - b + mo;
}
template <typename T1, typename T2>
inline T1 add(T1 a, T2 b) {
  return a + b >= mo ? a + b - mo : a + b;
}
template <typename T1, typename T2>
inline T1 del(T1 a, T2 b) {
  return a >= b ? a - b : a - b + mo;
}
vector<int> e[_];
inline void adde(int a, int b) { e[a].emplace_back(b); }
inline void addde(int a, int b) { adde(a, b), adde(b, a); }
int n, qn;
vector<int> et[_];
int dcnt = 0;
void dfs(int x, int ff) {
  et[x].emplace_back(++dcnt);
  for (auto b : e[x])
    if (b != ff) dfs(b, x), et[x].emplace_back(++dcnt);
}
int ps[_], lps, lim, rt;
pair<int, int> loc[_];
long long f[_][_v];
void finder() {
  lps = ty(), lim = ty(), rt = ty();
  for (int i = 1; i <= lps; i++) ps[i] = ty();
  int drt = et[rt][0];
  for (int i = 1; i <= lps; i++) {
    int a = ps[i];
    loc[i].first = *lower_bound(et[a].begin(), et[a].end(), drt);
    loc[i].second = *--upper_bound(et[a].begin(), et[a].end(), drt + dcnt);
  }
  sort(loc + 1, loc + lps + 1);
  priority_queue<int, vector<int>, greater<int>> now;
  for (int i = 0; i <= lps; i++) memset(f[i], 0, sizeof(f[i]));
  f[0][0] = 1;
  for (int i = 1; i <= lps; i++) {
    while (!now.empty() && now.top() < loc[i].first) now.pop();
    for (int j = 1; j <= min(lim, i); j++)
      f[i][j] = add(f[i - 1][j] * max(j - ((int)((now).size())), 0) % mo,
                    f[i - 1][j - 1]);
    now.emplace(loc[i].second);
  }
  long long ans = 0;
  for (int i = 1; i <= lim; i++) ad(ans, f[lps][i]);
  cout << ans << lf;
}
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), qn = ty();
  for (int i = 1, a, b; i < n; i++) a = ty(), b = ty(), addde(a, b);
  dfs(1, 0);
  for (int i = 1; i <= n; i++)
    for (int j = 0, jj = ((int)((et[i]).size())); j < jj; j++)
      et[i].emplace_back(et[i][j] + dcnt);
  for (int qq = 1; qq <= qn; qq++) finder();
  return 0;
}
