#include <bits/stdc++.h>
using namespace std;
int n, q, si = 1, leaf;
long long ans[500010];
struct Q {
  int s, e, ind;
};
vector<Q> query[500010];
vector<pair<int, int>> tree[500010];
int rs[500010];
struct seg {
  long long seg[2000010], lazy[2000010];
  void prop(int x) {
    seg[x] += lazy[x];
    if (x < si) {
      lazy[x * 2] += lazy[x];
      lazy[x * 2 + 1] += lazy[x];
    }
    lazy[x] = 0;
    return;
  }
  void add(int s, int e, long long v) {
    if (s > e) return;
    add(1, 1, si, s, e, v);
  }
  void add(int x, int l, int r, int s, int e, long long v) {
    prop(x);
    if (r < s || e < l) return;
    if (s <= l && r <= e) {
      lazy[x] += v;
      prop(x);
      return;
    }
    add(x * 2, l, (l + r) / 2, s, e, v);
    add(x * 2 + 1, (l + r) / 2 + 1, r, s, e, v);
    seg[x] = min(seg[x * 2], seg[x * 2 + 1]);
  }
  long long get(int s, int e) { return get(1, 1, si, s, e); }
  long long get(int x, int l, int r, int s, int e) {
    prop(x);
    if (r < s || e < l) return 1000000000000000LL;
    if (s <= l && r <= e) return seg[x];
    return min(get(x * 2, l, (l + r) / 2, s, e),
               get(x * 2 + 1, (l + r) / 2 + 1, r, s, e));
  }
} S;
void makeup(int x, long long dis) {
  rs[x] = x;
  if (tree[x].size() == 0) {
    S.add(x, x, dis);
    return;
  } else
    S.add(x, x, 1000000000000000LL);
  for (auto i : tree[x]) {
    makeup(i.first, dis + i.second);
    rs[x] = max(rs[x], rs[i.first]);
  }
}
void dfs(int x) {
  for (auto i : query[x]) ans[i.ind] = S.get(i.s, i.e);
  for (auto i : tree[x]) {
    S.add(i.first, rs[i.first], -i.second);
    S.add(1, i.first - 1, i.second);
    S.add(rs[i.first] + 1, n, i.second);
    dfs(i.first);
    S.add(i.first, rs[i.first], i.second);
    S.add(1, i.first - 1, -i.second);
    S.add(rs[i.first] + 1, n, -i.second);
  }
}
int main() {
  int i, a, b, c;
  scanf("%d %d", &n, &q);
  while (si < n) si <<= 1;
  for (i = 2; i <= n; i++) {
    scanf("%d %d", &a, &b);
    tree[a].push_back({i, b});
  }
  for (i = 1; i <= q; i++) {
    scanf("%d %d %d", &a, &b, &c);
    query[a].push_back({b, c, i});
  }
  makeup(1, 0);
  dfs(1);
  for (i = 1; i <= q; i++) printf("%lld\n", ans[i]);
}
