#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 10, inf = 1e18;
struct SegTree {
  long long l[N << 2], r[N << 2];
  long long mn[N << 2], tag[N << 2];
  inline void push_up(long long i) { mn[i] = min(mn[i << 1], mn[i << 1 | 1]); }
  inline void push_down(long long i) {
    mn[i << 1] += tag[i];
    mn[i << 1 | 1] += tag[i];
    tag[i << 1] += tag[i];
    tag[i << 1 | 1] += tag[i];
    tag[i] = 0;
  }
  void build(long long i, long long x, long long y) {
    l[i] = x;
    r[i] = y;
    if (x == y) return;
    build(i << 1, x, (x + y) >> 1);
    build(i << 1 | 1, ((x + y) >> 1) + 1, y);
  }
  void update(long long i, long long x, long long y, long long k) {
    if (l[i] >= x && r[i] <= y) {
      mn[i] += k;
      tag[i] += k;
      return;
    }
    push_down(i);
    if (r[i << 1] >= x) update(i << 1, x, y, k);
    if (l[i << 1 | 1] <= y) update(i << 1 | 1, x, y, k);
    push_up(i);
  }
  long long query(long long i, long long x, long long y) {
    if (l[i] >= x && r[i] <= y) return mn[i];
    push_down(i);
    long long ans = inf;
    if (r[i << 1] >= x) ans = min(ans, query(i << 1, x, y));
    if (l[i << 1 | 1] <= y) ans = min(ans, query(i << 1 | 1, x, y));
    push_up(i);
    return ans;
  }
};
SegTree dis1, dis2;
long long n, m, cnt, u[N << 2], v[N << 2], c[N << 2], f[N], dfn[N], siz[N],
    dep[N];
vector<pair<long long, long long> > edge[N];
long long dfs(long long u, long long sum, long long depth) {
  cnt++;
  dep[u] = depth;
  dfn[u] = cnt;
  siz[u] = 1;
  dis1.update(1, dfn[u], dfn[u], sum);
  dis2.update(1, dfn[u], dfn[u], sum + f[u]);
  for (long long i = 0; i < edge[u].size(); i++)
    siz[u] += dfs(edge[u][i].first, sum + edge[u][i].second, dep[u] + 1);
  return siz[u];
}
int main() {
  scanf("%lld%lld", &n, &m);
  dis1.build(1, 1, n);
  dis2.build(1, 1, n);
  for (long long i = 1; i <= n - 1; i++) {
    scanf("%lld%lld%lld", &u[i], &v[i], &c[i]);
    edge[u[i]].push_back(make_pair(v[i], c[i]));
  }
  for (long long i = n; i <= 2 * n - 2; i++) {
    scanf("%lld%lld%lld", &u[i], &v[i], &c[i]);
    f[u[i]] = c[i];
  }
  dfs(1ll, 0ll, 1ll);
  while (m--) {
    long long op, x, y;
    scanf("%lld%lld%lld", &op, &x, &y);
    if (op == 1) {
      if (x <= n - 1) {
        dis1.update(1ll, dfn[v[x]], dfn[v[x]] + siz[v[x]] - 1, y - c[x]);
        dis2.update(1ll, dfn[v[x]], dfn[v[x]] + siz[v[x]] - 1, y - c[x]);
        c[x] = y;
      } else {
        dis2.update(1ll, dfn[u[x]], dfn[u[x]], y - f[u[x]]);
        f[u[x]] = y;
      }
    } else {
      if (dfn[x] <= dfn[y] && dfn[x] + siz[x] - 1 >= dfn[y]) {
        printf("%lld\n", dis1.query(1ll, dfn[y], dfn[y]) -
                             dis1.query(1ll, dfn[x], dfn[x]));
      } else {
        printf("%lld\n", dis2.query(1ll, dfn[x], dfn[x] + siz[x] - 1) -
                             dis1.query(1ll, dfn[x], dfn[x]) +
                             dis1.query(1ll, dfn[y], dfn[y]));
      }
    }
  }
  return 0;
}
