#include <bits/stdc++.h>
using namespace std;
struct xy {
  long long x, y;
};
vector<xy> edge[515151];
long long S[521212], E[521212], depth[521212];
struct ND {
  long long l, r;
  long long buf, mn;
} node[1212121];
long long nn = 1;
void spread(long long w) {
  long long l = node[w].l, r = node[w].r;
  node[l].buf += node[w].buf;
  node[l].mn += node[w].buf;
  node[r].buf += node[w].buf;
  node[r].mn += node[w].buf;
  node[w].buf = 0;
}
void update(long long w) {
  long long l = node[w].l, r = node[w].r;
  node[w].mn = min(node[l].mn, node[r].mn);
}
void pls_g(long long now, long long s, long long e, long long l, long long r,
           long long g) {
  if (s != e) {
    if (!node[now].l) node[now].l = ++nn;
    if (!node[now].r) node[now].r = ++nn;
    spread(now);
  }
  if (s == l && e == r) {
    node[now].mn += g;
    node[now].buf += g;
    return;
  }
  long long m = (s + e) / 2;
  if (l <= m) pls_g(node[now].l, s, m, l, min(m, r), g);
  if (m + 1 <= r) pls_g(node[now].r, m + 1, e, max(l, m + 1), r, g);
  update(now);
}
long long get_min(long long now, long long s, long long e, long long l,
                  long long r) {
  if (s != e) {
    if (!node[now].l) node[now].l = ++nn;
    if (!node[now].r) node[now].r = ++nn;
    spread(now);
  }
  if (s == l && e == r) {
    return node[now].mn;
  }
  long long res = 1e16, m = (s + e) / 2;
  if (l <= m) res = min(res, get_min(node[now].l, s, m, l, min(m, r)));
  if (m + 1 <= r)
    res = min(res, get_min(node[now].r, m + 1, e, max(l, m + 1), r));
  update(now);
  return res;
}
long long last = 0;
void get_dep(long long w, long long dep) {
  depth[w] = dep;
  S[w] = w;
  last = w;
  for (xy E : edge[w]) {
    get_dep(E.x, dep + E.y);
  }
  E[w] = last;
}
struct lr {
  long long l, r, w;
};
vector<lr> qr[515151];
long long ans[515151], n;
void dfs(long long w) {
  if (w == 5) int sp = 1;
  for (lr Q : qr[w]) ans[Q.w] = get_min(1, 1, n, Q.l, Q.r);
  for (xy Ed : edge[w]) {
    long long nxt = Ed.x, val = Ed.y;
    pls_g(1, 1, n, 1, n, +val);
    pls_g(1, 1, n, S[nxt], E[nxt], -val * 2);
    dfs(nxt);
    pls_g(1, 1, n, 1, n, -val);
    pls_g(1, 1, n, S[nxt], E[nxt], +val * 2);
  }
}
int main() {
  long long q, i, j;
  scanf("%lld%lld", &n, &q);
  for (i = 2; i <= n; i++) {
    long long p, d;
    scanf("%lld%lld", &p, &d);
    edge[p].push_back({i, d});
  }
  for (i = 0; i < q; i++) {
    long long v, l, r;
    scanf("%lld%lld%lld", &v, &l, &r);
    qr[v].push_back({l, r, i});
  }
  get_dep(1, 0);
  for (i = 1; i <= n; i++) {
    if (edge[i].size())
      pls_g(1, 1, n, i, i, 1e16);
    else
      pls_g(1, 1, n, i, i, depth[i]);
  }
  dfs(1);
  for (i = 0; i < q; i++) printf("%lld\n", ans[i]);
  return 0;
}
