#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
const long long N = 2e5 + 100;
long long long long seg[4 * N], lazy[4 * N];
void shift(long long long long nod) {
  seg[nod * 2] += lazy[nod];
  seg[nod * 2 + 1] += lazy[nod];
  lazy[nod * 2] += lazy[nod];
  lazy[nod * 2 + 1] += lazy[nod];
  lazy[nod] = 0;
  return;
}
void upd(long long long long nod, long long long long l, long long long long r,
         long long long long L, long long long long R,
         long long long long val) {
  if (l >= R || L >= r) return;
  if (l >= L && r <= R) {
    seg[nod] += val;
    lazy[nod] += val;
    return;
  }
  long long long long mid = (r + l) / 2;
  shift(nod);
  upd(nod * 2, l, mid, L, R, val);
  upd(nod * 2 + 1, mid, r, L, R, val);
  seg[nod] = min(seg[nod * 2], seg[nod * 2 + 1]);
  return;
}
long long long long get(long long long long nod, long long long long l,
                        long long long long r, long long long long L,
                        long long long long R) {
  if (l >= R || L >= r) return (long long long long)1e15;
  if (l >= L && r <= R) return seg[nod];
  shift(nod);
  long long long long mid = (r + l) / 2;
  return min(get(nod * 2, l, mid, L, R), get(nod * 2 + 1, mid, r, L, R));
}
vector<pair<long long long long, long long long long> > g[N];
vector<pair<pair<long long long long, long long long long>, long long> > q[N];
long long long long st[N], fn[N], cnt1 = 1;
long long long long dfss(long long long long v, long long long long p,
                         long long long long h) {
  st[v] = cnt1;
  if (g[v].size() == 1)
    upd(1, 1, N, st[v], st[v] + 1, h);
  else
    upd(1, 1, N, st[v], st[v] + 1, (long long long long)1e16);
  sort(g[v].begin(), g[v].end());
  for (long long i = 0; i < g[v].size(); i++) {
    long long long long u = g[v][i].first;
    if (u == p) continue;
    cnt1++;
    dfss(u, v, h + g[v][i].second);
  }
  fn[v] = cnt1 + 1;
}
long long long long ans[N];
long long long long dfs(long long long long v, long long long long p) {
  for (long long i = 0; i < q[v].size(); i++) {
    long long long long l = q[v][i].first.first;
    long long long long r = q[v][i].first.second;
    long long long long id = q[v][i].second;
    ans[id] = get(1, 1, N, l, r + 1);
  }
  for (long long i = 0; i < g[v].size(); i++) {
    long long long long u = g[v][i].first;
    if (u == p) continue;
    upd(1, 1, N, st[u], fn[u], -2 * g[v][i].second);
    upd(1, 1, N, 1, N, g[v][i].second);
    dfs(u, v);
    upd(1, 1, N, st[u], fn[u], 2 * g[v][i].second);
    upd(1, 1, N, 1, N, -g[v][i].second);
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long long long n, m;
  cin >> n >> m;
  for (long long i = 2; i <= n; i++) {
    long long long long x, w;
    cin >> x >> w;
    g[x].push_back({i, w});
    g[i].push_back({x, w});
  }
  dfss(1, 1, 0);
  for (long long i = 0; i < m; i++) {
    long long long long v, l, r;
    cin >> v >> l >> r;
    q[v].push_back({{l, r}, i});
  }
  dfs(1, 1);
  for (long long i = 0; i < m; i++) cout << ans[i] << '\n';
}
