#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e16;
struct SegTree {
  struct node {
    int s, e;
    long long v, lz;
  };
  vector<node> t;
  SegTree() {}
  SegTree(int n) : t(n << 2) { build(1, 1, n); }
  void build(int i, int ss, int ee) {
    t[i].s = ss, t[i].e = ee;
    if (ss == ee) return;
    int m = (ss + ee) >> 1;
    build(i << 1, ss, m);
    build(i << 1 | 1, m + 1, ee);
  }
  void push(int i) {
    if (!t[i].lz) return;
    t[i].v += t[i].lz;
    if (t[i].s != t[i].v) t[i << 1].lz += t[i].lz, t[i << 1 | 1].lz += t[i].lz;
    t[i].lz = 0;
  }
  void update(int i, int us, int ue, long long v) {
    push(i);
    if (ue < t[i].s || t[i].e < us) return;
    if (us <= t[i].s && t[i].e <= ue) {
      t[i].lz += v;
      push(i);
      return;
    }
    update(i << 1, us, ue, v);
    update(i << 1 | 1, us, ue, v);
    t[i].v = min(t[i << 1].v, t[i << 1 | 1].v);
  }
  long long query(int i, int qs, int qe) {
    if (qe < t[i].s || t[i].e < qs) return INF;
    push(i);
    if (qs <= t[i].s && t[i].e <= qe) return t[i].v;
    return min(query(i << 1, qs, qe), query(i << 1 | 1, qs, qe));
  }
};
const int MAX_N = 5e5 + 5;
const int MAX_Q = 5e5 + 5;
int n, q;
vector<pair<int, int>> g[MAX_N];
array<int, 2> qry[MAX_Q];
vector<int> r[MAX_N];
long long ans[MAX_N];
SegTree st;
int sz[MAX_N], tin[MAX_N], cur = 0;
void dfs(int u, long long dep) {
  st.update(1, u, u, g[u].empty() ? dep : INF);
  sz[u] = 1;
  tin[u] = ++cur;
  for (auto &vw : g[u]) {
    int v, w;
    tie(v, w) = vw;
    dfs(v, dep + w), sz[u] += sz[v];
  }
}
void dfs2(int u) {
  for (int id : r[u]) ans[id] = st.query(1, qry[id][0], qry[id][1]);
  for (auto &vw : g[u]) {
    int v, w;
    tie(v, w) = vw;
    st.update(1, 1, n, w);
    st.update(1, tin[v], tin[v] + sz[v] - 1, -2 * w);
    dfs2(v);
    st.update(1, tin[v], tin[v] + sz[v] - 1, 2 * w);
    st.update(1, 1, n, -w);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    int p, w;
    cin >> p >> w;
    g[p].emplace_back(i, w);
  }
  for (int i = 0; i < q; i++) {
    int v;
    cin >> v >> qry[i][0] >> qry[i][1];
    r[v].push_back(i);
  }
  st = SegTree(n);
  dfs(1, 0);
  dfs2(1);
  for (int i = 0; i < q; i++) cout << ans[i] << "\n";
  return 0;
}
