#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
const long long int maxn = 5e5 + 16, md = 1e9 + 7, inf = 2e18;
long long int tav(long long int n, long long int k) {
  long long int res = 1;
  while (k > 0) {
    if (k & 1) {
      res *= n;
      res %= md;
    }
    n *= n;
    n %= md;
    k >>= 1;
  }
  return res;
}
struct segtree {
  long long int sz = 1;
  vector<long long int> val, laz;
  void init(long long int n) {
    while (sz < n) sz <<= 1;
    val.assign((sz << 1), 0);
    laz.assign((sz << 1), 0);
    return;
  }
  void shift(long long int x, long long int lx, long long int rx) {
    long long int h = laz[x];
    laz[x] = 0;
    if (h == 0) return;
    val[x] += h;
    if (rx - lx == 1) return;
    long long int ln = (x << 1) + 1, rn = ln + 1;
    laz[ln] += h;
    laz[rn] += h;
    return;
  }
  void add(long long int l, long long int r, long long int k, long long int x,
           long long int lx, long long int rx) {
    shift(x, lx, rx);
    if (rx <= l || lx >= r) return;
    if (rx <= r && lx >= l) {
      laz[x] = k;
      shift(x, lx, rx);
      return;
    }
    long long int m = (rx + lx) >> 1, ln = (x << 1) + 1, rn = ln + 1;
    add(l, r, k, ln, lx, m);
    add(l, r, k, rn, m, rx);
    val[x] = min(val[ln], val[rn]);
    return;
  }
  void add(long long int l, long long int r, long long int k) {
    add(l, r, k, 0, 0, sz);
    return;
  }
  long long int cal(long long int l, long long int r, long long int x,
                    long long int lx, long long int rx) {
    shift(x, lx, rx);
    if (rx <= l || lx >= r) return inf;
    if (rx <= r && lx >= l) return val[x];
    long long int m = (rx + lx) >> 1, ln = (x << 1) + 1, rn = ln + 1;
    long long int a = cal(l, r, ln, lx, m), b = cal(l, r, rn, m, rx);
    return min(a, b);
  }
  long long int cal(long long int l, long long int r) {
    return cal(l, r, 0, 0, sz);
  }
};
long long int n, q;
segtree st;
vector<pair<long long int, long long int> > adj[maxn];
vector<pair<pair<long long int, long long int>, long long int> > v[maxn];
long long int ft[maxn], tme = 0, ans[maxn], dis[maxn], dep = 0;
void dDFS(long long int r) {
  dis[r] = dep;
  tme++;
  for (auto p : adj[r]) {
    long long int i = p.first, w = p.second;
    dep += w;
    dDFS(i);
    dep -= w;
  }
  if (adj[r].empty()) {
    st.add(r, r + 1, dep);
  } else {
    st.add(r, r + 1, inf);
  }
  ft[r] = tme;
  return;
}
void sDFS(long long int r) {
  for (auto y : v[r]) {
    long long int l = y.first.first, r = y.first.second, i = y.second;
    ans[i] = st.cal(l, r);
  }
  for (auto p : adj[r]) {
    long long int i = p.first, w = p.second;
    st.add(0, n, w);
    st.add(i, ft[i], -2ll * w);
    sDFS(i);
    st.add(0, n, -w);
    st.add(i, ft[i], 2ll * w);
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (long long int u = 1; u < n; u++) {
    long long int v, w;
    cin >> v >> w;
    v--;
    adj[v].push_back({u, w});
  }
  st.init(n);
  for (long long int i = 0; i < q; i++) {
    long long int u, l, r;
    cin >> u >> l >> r;
    u--;
    l--;
    v[u].push_back({{l, r}, i});
  }
  dDFS(0);
  sDFS(0);
  for (long long int i = 0; i < q; i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}
