#include <bits/stdc++.h>
using namespace std;
long long las = 0;
long long num = 0;
struct Edge {
  long long to, len;
};
vector<Edge> g[1000005];
struct Node {
  long long l, r, id;
};
vector<Node> vec[1000005];
long long dep[1000005];
long long l[1000005], r[1000005];
long long ans[1000005];
long long n, q;
long long du[1000005];
namespace seg {
const long long M = 5e5 + 10;
const long long inf = 2e18;
long long mn[M << 2], add[M << 2];
void update(long long x) { mn[x] = min(mn[(x << 1)], mn[((x << 1) | 1)]); }
void build(long long x, long long l, long long r) {
  if (l == r) {
    if (!du[l])
      mn[x] = dep[l];
    else
      mn[x] = inf;
    return;
  }
  long long mid = (l + r) >> 1;
  build((x << 1), l, mid);
  build(((x << 1) | 1), mid + 1, r);
  update(x);
}
void add_(long long x, long long v) {
  add[x] += v;
  mn[x] += v;
}
void pushdown(long long x) {
  if (add[x]) {
    add_((x << 1), add[x]);
    add_(((x << 1) | 1), add[x]);
    add[x] = 0;
  }
}
void modify(long long x, long long l, long long r, long long L, long long R,
            long long d) {
  if (L > R) return;
  if (L <= l && R >= r) {
    add_(x, d);
    return;
  }
  pushdown(x);
  long long mid = (l + r) >> 1;
  if (L <= mid) modify((x << 1), l, mid, L, R, d);
  if (R > mid) modify(((x << 1) | 1), mid + 1, r, L, R, d);
  update(x);
}
long long query(long long x, long long l, long long r, long long L,
                long long R) {
  if (L > R) return 0;
  if (L <= l && R >= r) return mn[x];
  pushdown(x);
  long long mid = (l + r) >> 1;
  long long res = inf;
  if (L <= mid) res = query((x << 1), l, mid, L, R);
  if (R > mid) res = min(res, query(((x << 1) | 1), mid + 1, r, L, R));
  return res;
}
}  // namespace seg
using namespace seg;
void dfs(long long x) {
  l[x] = r[x] = x;
  for (long long i = 0; i < g[x].size(); i++) {
    long long u = g[x][i].to, len = g[x][i].len;
    dep[u] = dep[x] + len;
    dfs(u);
    r[x] = max(r[x], r[u]);
  }
}
void dfs2(long long x) {
  for (long long i = 0; i < vec[x].size(); i++) {
    Node cur = vec[x][i];
    ans[cur.id] = query(1, 1, n, cur.l, cur.r);
  }
  for (long long i = 0; i < g[x].size(); i++) {
    long long u = g[x][i].to, len = g[x][i].len;
    modify(1, 1, n, 1, l[u] - 1, len);
    modify(1, 1, n, r[u] + 1, n, len);
    modify(1, 1, n, l[u], r[u], -len);
    dfs2(u);
    modify(1, 1, n, 1, l[u] - 1, -len);
    modify(1, 1, n, r[u] + 1, n, -len);
    modify(1, 1, n, l[u], r[u], len);
  }
}
signed main() {
  cin >> n >> q;
  for (long long i = 2; i <= n; ++i) {
    long long x, len;
    scanf("%d%d", &x, &len);
    g[x].push_back((Edge){i, len});
    du[x]++;
  }
  dfs(1);
  build(1, 1, n);
  for (long long i = 1; i <= q; ++i) {
    long long x, l, r;
    scanf("%d%d%d", &x, &l, &r);
    vec[x].push_back((Node){l, r, i});
  }
  dfs2(1);
  for (long long i = 1; i <= q; ++i) printf("%lld\n", ans[i]);
  return 0;
}
