#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5 + 10;
vector<long long> V[maxn];
long long in[maxn], de[maxn], son[maxn];
long long tot, n, q;
void dfs(long long u, long long fa, long long dept) {
  in[u] = ++tot;
  de[u] = dept;
  son[u] = 0;
  for (long long i = 0; i < V[u].size(); i++) {
    long long v = V[u][i];
    if (v == fa) continue;
    dfs(v, u, dept + 1);
    son[u] = son[v] + 1;
  }
}
struct seg {
  long long tree[maxn << 2];
  long long add[maxn << 2];
  void pushup(long long rt) { tree[rt] = tree[rt << 1] + tree[rt << 1 | 1]; }
  void pushdown(long long L, long long R, long long rt) {
    if (add[rt] == 0) return;
    long long m = (L + R) >> 1;
    add[rt << 1] += add[rt];
    add[rt << 1 | 1] += add[rt];
    tree[rt << 1] += add[rt] * (m - L + 1);
    tree[rt << 1 | 1] += add[rt] * (R - m);
    add[rt] = 0;
  }
  void build(long long l, long long r, long long rt) {
    tree[rt] = add[rt] = 0;
    if (l == r) return;
    long long m = (r + l) >> 1;
    build(l, m, rt << 1);
    build(m + 1, r, rt << 1 | 1);
  }
  void update(long long L, long long R, long long val, long long l, long long r,
              long long rt) {
    if (L <= l && R >= r) {
      tree[rt] += val * (r - l + 1);
      add[rt] += val;
      return;
    }
    pushdown(l, r, rt);
    long long m = (r + l) >> 1;
    if (L <= m) update(L, R, val, l, m, rt << 1);
    if (R > m) update(L, R, val, m + 1, r, rt << 1 | 1);
    pushup(rt);
  }
  long long query(long long pos, long long l, long long r, long long rt) {
    if (l == r) return tree[rt];
    pushdown(l, r, rt);
    long long m = (r + l) >> 1;
    if (pos <= m)
      return query(pos, l, m, rt << 1);
    else
      return query(pos, m + 1, r, rt << 1 | 1);
  }
  void print(long long l, long long r, long long rt) {
    if (l == r) return;
    pushdown(l, r, rt);
    long long m = (l + r) >> 1;
    print(l, m, rt << 1);
    print(m + 1, r, rt << 1 | 1);
  }
} Leve, List;
void update(long long v, long long x, long long d) {
  if (v == 1) {
    Leve.update(1, d + 1, x, 1, n, 1);
    return;
  }
  if (de[v] >= d) {
    long long L = in[v] - d;
    long long R = (son[v] < d) ? (in[v] + son[v]) : (in[v] + d);
    if (de[v] == d) {
      List.update(1, 1, x, 1, n, 1);
      List.update(L + 1, R, x, 1, n, 1);
    } else
      List.update(L, R, x, 1, n, 1);
  } else {
    long long len = d - de[v];
    Leve.update(1, len + 1, x, 1, n, 1);
    long long L = in[v] - (de[v] - len) + 1;
    long long R = (son[v] < d) ? (in[v] + son[v]) : (in[v] + d);
    List.update(L, R, x, 1, n, 1);
  }
}
long long query(long long v) {
  return Leve.query(de[v] + 1, 1, n, 1) + List.query(in[v], 1, n, 1);
}
signed main() {
  tot = 0;
  scanf("%lld%lld", &n, &q);
  Leve.build(1, n, 1);
  List.build(1, n, 1);
  for (long long i = 1; i <= n; i++) V[i].clear();
  for (long long i = 0; i < n - 1; i++) {
    long long a, b;
    scanf("%lld%lld", &a, &b);
    V[a].push_back(b);
    V[b].push_back(a);
  }
  dfs(1, -1, 0);
  long long op;
  while (q--) {
    scanf("%lld", &op);
    if (op == 0) {
      long long v, x, d;
      scanf("%lld%lld%lld", &v, &x, &d);
      update(v, x, d);
    } else if (op == 1) {
      long long v;
      scanf("%lld", &v);
      printf("%lld\n", query(v));
    }
  }
}
