#include <bits/stdc++.h>
using namespace std;
int n, i, x, y, l, r, q;
long long A[500005], Rez[500005], AI[2000005], Lazy[2000005];
vector<pair<int, int> > V[500005];
vector<pair<int, pair<int, int> > > Q[500005];
void build(int nod, int st, int dr) {
  if (st == dr) {
    AI[nod] = A[st];
    return;
  }
  int mij = (st + dr) / 2;
  build(2 * nod, st, mij);
  build(2 * nod + 1, mij + 1, dr);
  AI[nod] = min(AI[2 * nod], AI[2 * nod + 1]);
}
void update(int nod, int st, int dr, int l, int r, long long val) {
  if (Lazy[nod]) {
    AI[nod] += Lazy[nod];
    if (st != dr) {
      Lazy[2 * nod] += Lazy[nod];
      Lazy[2 * nod + 1] += Lazy[nod];
    }
    Lazy[nod] = 0;
  }
  if (l <= st && dr <= r) {
    Lazy[nod] += val;
    return;
  }
  int mij = (st + dr) / 2;
  if (l <= mij) update(2 * nod, st, mij, l, r, val);
  if (mij < r) update(2 * nod + 1, mij + 1, dr, l, r, val);
  AI[nod] =
      min(AI[2 * nod] + Lazy[2 * nod], AI[2 * nod + 1] + Lazy[2 * nod + 1]);
}
long long rez;
void query(int nod, int st, int dr, int l, int r) {
  if (Lazy[nod]) {
    AI[nod] += Lazy[nod];
    if (st != dr) {
      Lazy[2 * nod] += Lazy[nod];
      Lazy[2 * nod + 1] += Lazy[nod];
    }
    Lazy[nod] = 0;
  }
  if (l <= st && dr <= r) {
    rez = min(rez, AI[nod]);
    return;
  }
  int mij = (st + dr) / 2;
  if (l <= mij) query(2 * nod, st, mij, l, r);
  if (mij < r) query(2 * nod + 1, mij + 1, dr, l, r);
}
void dfs(int nod, long long d) {
  vector<pair<int, int> >::iterator it;
  for (it = V[nod].begin(); it != V[nod].end(); it++)
    dfs((*it).first, d + 1LL * (*it).second);
  if (V[nod].size() == 0) A[nod] = d;
}
void solve(int nod, int st, int dr) {
  vector<pair<int, pair<int, int> > >::iterator it;
  for (it = Q[nod].begin(); it != Q[nod].end(); it++) {
    rez = 1000000000000000000LL;
    query(1, 1, n, (*it).second.first, (*it).second.second);
    Rez[(*it).first] = rez;
  }
  int i;
  for (i = 0; i < V[nod].size(); i++) {
    update(1, 1, n, 1, n, V[nod][i].second);
    if (i + 1 < V[nod].size()) {
      update(1, 1, n, V[nod][i].first, V[nod][i + 1].first - 1,
             -2 * V[nod][i].second);
      solve(V[nod][i].first, V[nod][i].first, V[nod][i + 1].first - 1);
      update(1, 1, n, V[nod][i].first, V[nod][i + 1].first - 1,
             2 * V[nod][i].second);
    } else {
      update(1, 1, n, V[nod][i].first, dr, -2 * V[nod][i].second);
      solve(V[nod][i].first, V[nod][i].first, dr);
      update(1, 1, n, V[nod][i].first, dr, 2 * V[nod][i].second);
    }
    update(1, 1, n, 1, n, -V[nod][i].second);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  A[1] = 1000000000000000000LL;
  for (i = 2; i <= n; i++) {
    cin >> x >> y;
    V[x].push_back({i, y});
    A[i] = 1000000000000000000LL;
  }
  for (i = 1; i <= q; i++) {
    cin >> x >> l >> r;
    Q[x].push_back({i, {l, r}});
  }
  dfs(1, 0);
  build(1, 1, n);
  solve(1, 1, n);
  for (i = 1; i <= q; i++) cout << Rez[i] << "\n";
  return 0;
}
