#include <bits/stdc++.h>
using namespace std;
void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << ' ' << H;
  debug_out(T...);
}
const long long INF = 1e16;
const long long MOD = 1e9 + 7;
const int N = 5e5 + 5;
int n, ST[N], FN[N], L[N], R[N], ts;
vector<int> Q[N];
vector<pair<int, int> > G[N];
long long D[N], SEG[N << 2], LAZY[N << 2], ANS[N];
void Apply(int id, long long x) { SEG[id] += x, LAZY[id] += x; }
void Shift(int id) {
  if (LAZY[id] == 0) return;
  Apply(id << 1, LAZY[id]);
  Apply(id << 1 | 1, LAZY[id]);
  LAZY[id] = 0;
}
void Update(int l, int r, long long x, int id = 1, int s = 0, int e = n) {
  if (l >= e || s >= r) return;
  if (l <= s && e <= r) return Apply(id, x);
  Shift(id);
  int md = (s + e) >> 1;
  Update(l, r, x, id << 1, s, md);
  Update(l, r, x, id << 1 | 1, md, e);
  SEG[id] = min(SEG[id << 1], SEG[id << 1 | 1]);
}
long long Get(int l, int r, int id = 1, int s = 0, int e = n) {
  if (l >= e || s >= r) return INF;
  if (l <= s && e <= r) return SEG[id];
  Shift(id);
  int md = (s + e) >> 1;
  return min(Get(l, r, id << 1, s, md), Get(l, r, id << 1 | 1, md, e));
}
void DFST(int v) {
  ST[v] = ts++;
  for (pair<int, int> e : G[v]) D[e.first] = D[v] + e.second, DFST(e.first);
  FN[v] = ts;
}
void DFS(int v) {
  for (int i : Q[v]) ANS[i] = Get(L[i], R[i]);
  for (pair<int, int> e : G[v]) {
    Update(0, n, e.second);
    Update(ST[e.first], FN[e.first], -2 * e.second);
    DFS(e.first);
    Update(ST[e.first], FN[e.first], +2 * e.second);
    Update(0, n, -e.second);
  }
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int q;
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    int p, w;
    cin >> p >> w;
    G[p].push_back(make_pair(i, w));
  }
  for (int i = 0; i < q; i++) {
    int v;
    cin >> v >> L[i] >> R[i];
    L[i]--;
    Q[v].push_back(i);
  }
  DFST(1);
  for (int i = 1; i <= n; i++) {
    if (G[i].empty())
      Update(ST[i], ST[i] + 1, D[i]);
    else
      Update(ST[i], ST[i] + 1, INF);
  }
  DFS(1);
  for (int i = 0; i < q; i++) cout << ANS[i] << '\n';
  return 0;
}
