#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &item) {
  out << '(' << item.first << ", " << item.second << ')';
  return out;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  for (const auto &item : v) out << item << ' ';
  return out;
}
const int N = 150010;
const int MOD = 998244353;
int k, n, invn;
int tin[N], tout[N], bit[N], store[N], nxt[N], heavyChild[N], fth[N], sz[N];
vector<int> adj[N];
int dfs(int v, int p = -1) {
  int heavy = -1, maxSz = -1;
  sz[v] = 1;
  tin[v] = k++;
  for (auto u : adj[v])
    if (u != p) {
      int aux = dfs(u, v);
      fth[u] = v;
      sz[v] += aux;
      if (aux > maxSz) maxSz = aux, heavy = u;
    }
  heavyChild[v] = heavy;
  tout[v] = k;
  return sz[v];
}
void dfsLight(int v, int lightV = -1, int p = -1) {
  nxt[v] = lightV;
  for (auto u : adj[v])
    if (u != p) {
      dfsLight(u, heavyChild[v] == u ? lightV : u, v);
    }
}
int pw(int base, int exp, int mod) {
  int res;
  for (res = 1; exp; exp >>= 1) {
    if (exp & 1) res = (1LL * res * base) % mod;
    base = (1LL * base * base) % mod;
  }
  return res;
}
int modInv(int base, int mod) { return pw(base, mod - 2, mod); }
void add(int &x, int y) {
  if ((x += y) >= MOD) x -= MOD;
}
int sum(int x, int y) { return (x + y < MOD ? x + y : x + y - MOD); }
void update(int p, int val) {
  for (; p; p &= p - 1) add(bit[p], val);
}
void update(int l, int r, int val) {
  if (val) {
    update(l - 1, MOD - val);
    update(r, val);
  }
}
int query(int p) {
  int res = 0;
  for (; p < N; p += p & (-p)) add(res, bit[p]);
  return res;
}
void process(int v, int d) {
  if (heavyChild[v] > 0) {
    int u = heavyChild[v];
    int prob = (1LL * (n - sz[u]) * invn) % MOD;
    update(tin[u], tout[u] - 1, (1LL * prob * d) % MOD);
  }
  int prob = (1LL * sz[v] * invn) % MOD;
  int x = (1LL * prob * d) % MOD;
  if (x) {
    update(1, n, x);
    update(tin[v], tout[v] - 1, MOD - x);
  }
  add(store[v], d);
}
int solve(int v) {
  int res = sum(store[v], query(tin[v]));
  while (nxt[v] > 0) {
    v = nxt[v];
    int prob = (1LL * (n - sz[v]) * invn) % MOD;
    int x = (1LL * prob * store[fth[v]]) % MOD;
    add(res, x);
    v = nxt[fth[v]];
  }
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  int q, a, b;
  cin >> n >> q;
  invn = modInv(n, MOD);
  for (int i = 1; i < n; ++i) {
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  k = 1;
  dfs(1);
  dfsLight(1);
  int type, v, d;
  while (q--) {
    cin >> type;
    if (type == 1) {
      cin >> v >> d;
      process(v, d);
    } else {
      cin >> v;
      cout << solve(v) << '\n';
    }
  }
  return 0;
}
