#include <bits/stdc++.h>
using namespace std;
long long M = 1e9 + 7;
const int N = 5e5 + 7;
int n, q;
vector<int> kid[N];
int h[N], st[N], ft[N];
long long hw[N];
int tim = 1;
void dfs(int v) {
  st[v] = tim++;
  sort(kid[v].begin(), kid[v].end());
  for (auto u : kid[v]) dfs(u);
  ft[v] = tim;
}
long long laz[N * 4], seg[N * 4];
void spl(int v) {
  for (int u = (v * 2); u <= (v * 2 + 1); u++) {
    laz[u] += laz[v];
    seg[u] += laz[v];
  }
  laz[v] = 0;
}
void add(int l, int r, long long val, int v = 1, int s = 1, int e = n + 1) {
  if (r <= s || e <= l) return;
  if (l <= s && e <= r) {
    seg[v] += val;
    laz[v] += val;
    return;
  }
  spl(v);
  add(l, r, val, (v * 2), s, ((s + e) / 2));
  add(l, r, val, (v * 2 + 1), ((s + e) / 2), e);
  seg[v] = min(seg[(v * 2)], seg[(v * 2 + 1)]);
}
long long get(int l, int r, int v = 1, int s = 1, int e = n + 1) {
  if (r <= s || e <= l) return 1e18;
  if (l <= s && e <= r) return seg[v];
  spl(v);
  return min(get(l, r, (v * 2), s, ((s + e) / 2)),
             get(l, r, (v * 2 + 1), ((s + e) / 2), e));
}
vector<pair<int, pair<int, int> > > qr[N];
long long res[N];
void solve(int v) {
  add(st[v], ft[v], -2 * hw[v]);
  for (auto p : qr[v])
    res[p.first] = hw[v] + get(p.second.first, p.second.second + 1);
  for (auto u : kid[v]) {
    add(st[u], ft[u], 2 * hw[v]);
    solve(u);
    add(st[u], ft[u], -2 * hw[v]);
  }
  add(st[v], ft[v], 2 * hw[v]);
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    int p, w;
    cin >> p >> w;
    kid[p].push_back(i);
    h[i] = h[p] + 1;
    hw[i] = hw[p] + w;
  }
  dfs(1);
  for (int i = 1; i <= n; i++)
    if (!kid[i].size())
      add(st[i], st[i] + 1, hw[i]);
    else
      add(st[i], st[i] + 1, 1e18);
  for (int i = 1; i <= q; i++) {
    int v, l, r;
    cin >> v >> l >> r;
    qr[v].push_back({i, {l, r}});
  }
  solve(1);
  for (int i = 1; i <= q; i++) cout << res[i] << ' ';
}
