#include <bits/stdc++.h>
using namespace std;
int gcd(int x, int y) { return (!y ? x : gcd(y, x % y)); }
const int maxn = 5e5 + 10;
const int SS = maxn * 4;
const long long inf = 1e16;
long long seg[SS], lazy[SS];
long long dep[maxn];
vector<pair<int, int> > adj[maxn];
int n;
void shift(int v) {
  long long t = lazy[v];
  lazy[v] = 0;
  lazy[2 * v] += t, seg[2 * v] += t;
  lazy[2 * v + 1] += t, seg[2 * v + 1] += t;
}
void init(int v = 1, int l = 0, int r = n) {
  if (r - l == 1) {
    seg[v] = dep[l];
    if (adj[l].size()) seg[v] = inf;
    return;
  }
  int mid = r + l >> 1;
  init(2 * v, l, mid);
  init(2 * v + 1, mid, r);
  seg[v] = min(seg[2 * v], seg[2 * v + 1]);
}
void add(int x, int y, int val, int v = 1, int l = 0, int r = n) {
  if (x >= r || y <= l) return;
  if (x <= l && y >= r) {
    seg[v] += val;
    lazy[v] += val;
    return;
  }
  int mid = l + r >> 1;
  shift(v);
  add(x, y, val, 2 * v, l, mid);
  add(x, y, val, 2 * v + 1, mid, r);
  seg[v] = min(seg[2 * v], seg[2 * v + 1]);
}
long long get_min(int x, int y, int v = 1, int l = 0, int r = n) {
  if (x >= r || y <= l) return inf;
  if (x <= l && y >= r) return seg[v];
  int mid = r + l >> 1;
  shift(v);
  long long t1 = get_min(x, y, 2 * v, l, mid);
  long long t2 = get_min(x, y, 2 * v + 1, mid, r);
  return min(t1, t2);
}
int st[maxn], ft[maxn], tim = 0;
void prep(int v) {
  st[v] = tim++;
  for (auto u : adj[v]) {
    dep[u.first] = dep[v] + u.second;
    prep(u.first);
  }
  ft[v] = tim;
}
long long answer[maxn];
int lef[maxn], rig[maxn];
vector<int> qu[maxn];
void dfs(int v) {
  for (auto i : qu[v]) {
    answer[i] = get_min(lef[i], rig[i]);
  }
  for (auto e : adj[v]) {
    int we = e.second;
    int u = e.first;
    add(st[u], ft[u], -we);
    add(0, st[u], we);
    add(ft[u], n, we);
    dfs(u);
    we *= -1;
    add(st[u], ft[u], -we);
    add(0, st[u], we);
    add(ft[u], n, we);
  }
}
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int q;
  cin >> n >> q;
  for (int i = 1; i < n; i++) {
    int par, w;
    cin >> par >> w;
    par--;
    adj[par].push_back({i, w});
  }
  for (int i = 0; i < n; i++) sort(adj[i].begin(), adj[i].end());
  prep(0);
  init();
  for (int i = 0; i < q; i++) {
    int v, l, r;
    cin >> v >> l >> r;
    v--;
    qu[v].push_back(i);
    lef[i] = l - 1;
    rig[i] = r;
  }
  dfs(0);
  for (int i = 0; i < q; i++) cout << answer[i] << '\n';
}
