#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;   }