#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 500;
const long long INF = 1e15;
int n, q;
struct tree_node {
  int l, r;
  long long dis;
} node[maxn];
struct edge {
  int from;
  int to;
  long long len;
};
vector<edge> v[maxn];
int cnt = 0;
void dfs(int a, int fa, long long len) {
  cnt++;
  node[a].l = a;
  node[a].dis = len;
  for (auto it = v[a].begin(); it != v[a].end(); it++) {
    if ((*it).to == fa) continue;
    dfs((*it).to, a, len + (*it).len);
  }
  node[a].r = cnt;
}
struct segment_tree {
  int l, r;
  long long lazy;
  long long sum;
  long long mmin;
} Seg[maxn << 2];
void push_down(int step) {
  if (Seg[step].lazy) {
    if (Seg[step << 1].lazy < INF) Seg[step << 1].lazy += Seg[step].lazy;
    if (Seg[step << 1].sum < INF)
      Seg[step << 1].sum +=
          Seg[step].lazy * (Seg[step << 1].r - Seg[step << 1].l + 1);
    if (Seg[step << 1].mmin < INF) Seg[step << 1].mmin += Seg[step].lazy;
    if (Seg[step << 1 | 1].lazy < INF)
      Seg[step << 1 | 1].lazy += Seg[step].lazy;
    if (Seg[step << 1 | 1].sum < INF)
      Seg[step << 1 | 1].sum +=
          Seg[step].lazy * (Seg[step << 1 | 1].r - Seg[step << 1 | 1].l + 1);
    if (Seg[step << 1 | 1].mmin < INF)
      Seg[step << 1 | 1].mmin += Seg[step].lazy;
    Seg[step].lazy = 0;
  }
}
void push_up(int step) {
  Seg[step].sum = Seg[step << 1].sum + Seg[step << 1 | 1].sum;
  Seg[step].mmin = min(Seg[step << 1].mmin, Seg[step << 1 | 1].mmin);
}
void build(int l, int r, int step) {
  Seg[step].l = l;
  Seg[step].r = r;
  Seg[step].lazy = 0;
  Seg[step].sum = INF;
  Seg[step].mmin = INF;
  if (l == r) {
    if (node[l].l == node[l].r) {
      Seg[step].sum = Seg[step].mmin = node[l].dis;
    }
    return;
  }
  int mid = (l + r) / 2;
  build(l, mid, step << 1);
  build(mid + 1, r, step << 1 | 1);
  push_up(step);
}
void update(int l, int r, int step, long long val) {
  if (Seg[step].l == l && Seg[step].r == r) {
    if (Seg[step].lazy < INF) Seg[step].lazy += val;
    if (Seg[step].sum < INF) Seg[step].sum += 1ll * (r - l + 1) * val;
    if (Seg[step].mmin < INF) Seg[step].mmin += val;
    return;
  }
  push_down(step);
  int mid = (Seg[step].l + Seg[step].r) / 2;
  if (r <= mid)
    update(l, r, step << 1, val);
  else if (l > mid)
    update(l, r, step << 1 | 1, val);
  else {
    update(l, mid, step << 1, val);
    update(mid + 1, r, step << 1 | 1, val);
  }
  push_up(step);
}
long long query(int l, int r, int step) {
  if (Seg[step].l == l && Seg[step].r == r) {
    return Seg[step].mmin;
  }
  push_down(step);
  int mid = (Seg[step].l + Seg[step].r) / 2;
  if (r <= mid)
    return query(l, r, step << 1);
  else if (l > mid)
    return query(l, r, step << 1 | 1);
  else {
    return min(query(l, mid, step << 1), query(mid + 1, r, step << 1 | 1));
  }
}
struct Query {
  int v;
  int l, r;
  int num;
  long long res;
} Q[maxn];
bool cmp1(const Query &x, const Query &y) { return x.v < y.v; }
bool cmp2(const Query &x, const Query &y) { return x.num < y.num; }
int cntt = 0;
void dfs2(int a, int fa, long long len) {
  update(node[a].l, node[a].r, 1, -1ll * len);
  if (node[a].l > 1) update(1, node[a].l - 1, 1, len);
  if (node[a].r < n) update(node[a].r + 1, n, 1, len);
  while (Q[cntt].v == a) {
    Q[cntt].res = query(Q[cntt].l, Q[cntt].r, 1);
    cntt++;
  }
  for (auto it = v[a].begin(); it != v[a].end(); it++) {
    if ((*it).to == fa) continue;
    int len = (*it).len;
    int now = (*it).to;
    dfs2(now, a, len);
  }
  update(node[a].l, node[a].r, 1, 1ll * len);
  if (node[a].l > 1) update(1, node[a].l - 1, 1, -1ll * len);
  if (node[a].r < n) update(node[a].r + 1, n, 1, -1ll * len);
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 2; i <= n; i++) {
    int p;
    long long w;
    scanf("%d%lld", &p, &w);
    edge x;
    x.from = p;
    x.to = i;
    x.len = w;
    v[p].push_back(x);
  }
  dfs(1, 0, 0);
  build(1, n, 1);
  for (int i = 0; i < q; i++) {
    scanf("%d%d%d", &Q[i].v, &Q[i].l, &Q[i].r);
    Q[i].num = i;
  }
  sort(Q, Q + q, cmp1);
  dfs2(1, 0, 0);
  sort(Q, Q + q, cmp2);
  for (int i = 0; i < q; i++) {
    printf("%lld\n", Q[i].res);
  }
}
