#include <bits/stdc++.h>
using namespace std;
namespace NTT {
int mbase, base, root;
int w[1 << 19];
int rev[1 << 19];
int modPow(int b, int e) {
  int r = 1;
  while (e > 0) {
    if (e & 1) r = ((long long int)r * b) % 998244353;
    e >>= 1;
    b = ((long long int)b * b) % 998244353;
  }
  return r;
}
int setBase(int nbase) {
  int i, j;
  mbase = 1;
  while (!(998244353 & (1 << mbase))) mbase++;
  root = 2;
  while ((modPow(root, 1 << mbase) != 1) ||
         (modPow(root, 1 << (mbase - 1)) == 1))
    root++;
  base = nbase;
  for (i = 0; i < (1 << base); i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (base - 1));
  w[0] = 0, w[1] = 1;
  for (i = 1; i < nbase; i++) {
    int z = modPow(root, 1 << (mbase - i - 1));
    for (j = (1 << (i - 1)); j < (1 << i); j++)
      w[j << 1] = w[j], w[(j << 1) | 1] = ((long long int)w[j] * z) % 998244353;
  }
  return 0;
}
int FFT(vector<int>& a, int inv) {
  int i, j, k;
  int l = 0;
  while ((1 << l) < a.size()) l++;
  int s = base - l;
  for (i = 0; i < a.size(); i++) {
    if (i < (rev[i] >> s)) swap(a[i], a[rev[i] >> s]);
  }
  for (k = 1; k < a.size(); k <<= 1) {
    for (i = 0; i < a.size(); i += (k << 1)) {
      for (j = 0; j < k; j++) {
        int z = ((long long int)a[i + j + k] * w[j + k]) % 998244353;
        a[i + j + k] = a[i + j] - z, a[i + j] += z;
        if (a[i + j + k] < 0) a[i + j + k] += 998244353;
        if (a[i + j] >= 998244353) a[i + j] -= 998244353;
      }
    }
  }
  return 0;
}
vector<int> multiply(vector<int> A, vector<int> B) {
  int i, n = 1;
  while (n < A.size() + B.size() - 1) n <<= 1;
  vector<int> a(n, 0), b(n, 0);
  for (i = 0; i < A.size(); i++) a[i] = A[i];
  for (i = 0; i < B.size(); i++) b[i] = B[i];
  FFT(a, 0), FFT(b, 0);
  int x = modPow(n, 998244353 - 2);
  for (i = 0; i < n; i++)
    a[i] = ((((long long int)a[i] * b[i]) % 998244353) * x) % 998244353;
  reverse(a.begin() + 1, a.end()), FFT(a, 1), a.resize(A.size() + B.size() - 1);
  return a;
}
}  // namespace NTT
vector<int> adjList[100000];
int parent[100000], size[100000], heavy[100000], light[100000];
vector<int> pp[100000];
vector<int> path;
int doDFS(int u, int p) {
  int i;
  parent[u] = p, size[u] = 1, heavy[u] = light[u] = -1;
  for (i = 0; i < adjList[u].size(); i++) {
    int v = adjList[u][i];
    if (v != p) {
      size[u] += doDFS(v, u);
      if (heavy[u] == -1)
        heavy[u] = v;
      else {
        if (size[v] > size[heavy[u]])
          light[u] = heavy[u], heavy[u] = v;
        else
          light[u] = v;
      }
    }
  }
  return size[u];
}
vector<int> chain[100000];
pair<vector<int>, vector<int> > mult(int l, int r) {
  if (l == r) {
    vector<int> v = chain[l];
    v[0]++;
    return make_pair(chain[l], v);
  }
  int i, m = (l + r) / 2;
  pair<vector<int>, vector<int> > L = mult(l, m), R = mult(m + 1, r);
  L.second[0] += 998244353 - 1, L.second[0] %= 998244353;
  vector<int> v = NTT::multiply(L.second, R.first);
  v.resize(max(v.size(), R.second.size()));
  for (i = 0; i < R.second.size(); i++) v[i] += R.second[i], v[i] %= 998244353;
  return make_pair(NTT::multiply(L.first, R.first), v);
}
int getAns(int u) {
  int c = 0;
  while (path.back() != u) {
    chain[c] =
        (light[path.back()] == -1) ? vector<int>(1, 1) : pp[light[path.back()]];
    chain[c].insert(chain[c].begin(), 0), c++, path.pop_back();
  }
  chain[c] =
      (light[path.back()] == -1) ? vector<int>(1, 1) : pp[light[path.back()]];
  chain[c].insert(chain[c].begin(), 0), c++, path.pop_back();
  pp[u] = mult(0, c - 1).second;
  return 0;
}
int doHLD(int u, int p) {
  path.push_back(u);
  if (light[u] != -1) doHLD(light[u], u), getAns(light[u]);
  if (heavy[u] != -1) doHLD(heavy[u], u);
  return 0;
}
int main() {
  int i;
  int n, a, b;
  long long int x;
  scanf("%d %I64d", &n, &x);
  for (i = 0; i < n - 1; i++) {
    scanf("%d %d", &a, &b);
    a--, b--;
    adjList[a].push_back(b);
    adjList[b].push_back(a);
  }
  NTT::setBase(17);
  doDFS(0, -1), doHLD(0, -1), getAns(0);
  vector<int> poly = pp[0];
  long long int ans = 0, c = 1;
  for (i = 1; i < poly.size(); i++) {
    ans += poly[i] * c, ans %= 998244353;
    c *= (x + i) % 998244353, c %= 998244353,
        c *= NTT::modPow(i, 998244353 - 2), c %= 998244353;
  }
  printf("%I64d\n", ans);
  return 0;
}
