#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;
const int g = 3;
inline int Mul(int a, int b) {
  unsigned long long x = (long long)a * b;
  unsigned xh = (unsigned)(x >> 32), xl = (unsigned)x, d, m;
  asm("divl %4;\n\t" : "=a"(d), "=d"(m) : "d"(xh), "a"(xl), "r"(MOD));
  return m;
}
int Qpow(int x, int y = MOD - 2) {
  int res = 1;
  for (; y; y >>= 1, x = Mul(x, x))
    if (y & 1) res = Mul(res, x);
  return res;
}
int n, K, jc[N], njc[N];
int Ar(int n, int m) { return Mul(jc[n], njc[n - m]); }
int sz[N], sm[N];
vector<int> G[N];
int U(int x, int y) { return ((x += y) >= MOD) ? (x - MOD) : x; }
void SU(int& x, int y) { ((x += y) >= MOD) ? (x -= MOD) : 0; }
int ans;
vector<int> t;
int w[N] = {1};
void FFT(vector<int>& A, bool fl) {
  int L = A.size();
  if (fl) {
    int t = Qpow(L);
    for (int& v : A) v = Mul(v, t);
    reverse(A.begin() + 1, A.end());
  }
  for (int i = 1, j = L >> 1, k; i < L; ++i, j ^= k) {
    if (i < j) swap(A[i], A[j]);
    k = L >> 1;
    while (j & k) {
      j ^= k;
      k >>= 1;
    }
  }
  for (int i = 1; i < L; i <<= 1) {
    int t = Qpow(g, (MOD - 1) / (i << 1));
    for (int j = 1; j < i; ++j) w[j] = Mul(w[j - 1], t);
    for (int j = 0; j < L; j += (i << 1)) {
      for (int k = 0; k < i; ++k) {
        int x = A[j + k], y = Mul(A[i + j + k], w[k]);
        A[j + k] = (x + y >= MOD ? x + y - MOD : x + y);
        A[i + j + k] = (x - y < 0 ? x - y + MOD : x - y);
      }
    }
  }
}
vector<int> operator*(vector<int> A, vector<int> B) {
  int need = A.size() + B.size() - 1, L;
  for (L = 1; L < need; L <<= 1)
    ;
  A.resize(L);
  FFT(A, false);
  B.resize(L);
  FFT(B, false);
  for (int i = 0; i < L; ++i) A[i] = Mul(A[i], B[i]);
  FFT(A, true);
  A.resize(min(K + 1, need));
  return A;
}
vector<int> DivCalc(int l, int r) {
  if (l < r)
    return DivCalc(l, (l + r) >> 1) * DivCalc(((l + r) >> 1) + 1, r);
  else if (l == r)
    return {1, t[l]};
  else
    return {1};
}
int Dark(vector<int> p, int x, int y) {
  for (int i = 1; i <= (int)p.size() - 1; ++i) SU(p[i], MOD - Mul(y, p[i - 1]));
  for (int i = p.size() - 1; i > 0; --i) SU(p[i], Mul(x, p[i - 1]));
  int res = 0;
  for (int i = 1; i < (int)p.size(); ++i) SU(res, Mul(p[i], Ar(K, i)));
  return res;
}
int rec[N], vis[N], cc;
void Dfs(int u, int fa = 0) {
  sz[u] = sm[u] = 1;
  for (int v : G[u])
    if (v != fa) {
      Dfs(v, u);
      SU(ans, Mul(sm[u], sm[v]));
      SU(sm[u], sm[v]);
      sz[u] += sz[v];
    }
  t.clear();
  for (int v : G[u])
    if (v != fa) t.emplace_back(sz[v]);
  static vector<int> p;
  p = DivCalc(0, t.size() - 1);
  if ((int)p.size() - 1 > K) p.resize(K + 1);
  for (int i = 1; i < (int)p.size(); ++i) SU(sm[u], Mul(Ar(K, i), p[i]));
  ++cc;
  for (int v : G[u])
    if (v != fa) {
      if (vis[sz[v]] != cc) {
        rec[sz[v]] = Dark(p, n - sz[u], sz[v]);
        vis[sz[v]] = cc;
      }
      SU(ans, Mul(rec[sz[v]], sm[v]));
    }
}
void Prework() {
  jc[0] = 1;
  for (int i = 1; i <= K; ++i) jc[i] = Mul(jc[i - 1], i);
  njc[K] = Qpow(jc[K]);
  for (int i = K - 1; ~i; --i) njc[i] = Mul(njc[i + 1], i + 1);
}
int main() {
  scanf("%d%d", &n, &K);
  if (K == 1) {
    printf("%lld\n", (long long)n * (n - 1) / 2 % MOD);
    return 0;
  }
  Prework();
  for (int i = 1, u, v; i < n; ++i) {
    scanf("%d%d", &u, &v);
    G[u].emplace_back(v);
    G[v].emplace_back(u);
  }
  Dfs(1);
  printf("%d\n", ans);
  return 0;
}
