#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
const long long inf = 1e17;
int q, n, mx[N];
vector<pair<int, int> > E[N];
vector<pair<int, pair<int, int> > > Q[N];
long long dis[N], ans[N], t[N << 2], tag[N];
void dfs(int x) {
  mx[x] = x;
  for (auto P : E[x])
    dis[P.first] = dis[x] + P.second, dfs(P.first),
    mx[x] = max(mx[x], mx[P.first]);
}
void buildtree(int x, int l, int r) {
  if (l == r) {
    t[x] = E[l].size() ? inf : dis[l];
    return;
  }
  int mid = (l + r) >> 1;
  buildtree(x << 1, l, mid);
  buildtree(x << 1 | 1, mid + 1, r);
  t[x] = min(t[x << 1], t[x << 1 | 1]);
}
void put(int x, long long k) {
  t[x] += k;
  tag[x] += k;
}
void pushdown(int x) {
  long long &v = tag[x];
  if (v) put(x << 1, v), put(x << 1 | 1, v), v = 0;
}
long long Query(int x, int l, int r, int gl, int gr) {
  if (l >= gl && r <= gr) return t[x];
  int mid = (l + r) >> 1;
  long long res = inf;
  pushdown(x);
  if (gl <= mid) res = min(res, Query(x << 1, l, mid, gl, gr));
  if (gr > mid) res = min(res, Query(x << 1 | 1, mid + 1, r, gl, gr));
  return res;
}
void Add(int x, int l, int r, int gl, int gr, long long k) {
  if (l >= gl && r <= gr) {
    put(x, k);
    return;
  }
  int mid = (l + r) >> 1;
  pushdown(x);
  if (gl <= mid) Add(x << 1, l, mid, gl, gr, k);
  if (gr > mid) Add(x << 1 | 1, mid + 1, r, gl, gr, k);
  t[x] = min(t[x << 1], t[x << 1 | 1]);
}
void dfscalc(int x) {
  for (auto P : Q[x])
    ans[P.first] = Query(1, 1, n, P.second.first, P.second.second);
  for (auto P : E[x]) {
    Add(1, 1, n, 1, n, P.second);
    Add(1, 1, n, P.first, mx[P.first], -2ll * P.second);
    dfscalc(P.first);
    Add(1, 1, n, P.first, mx[P.first], 2ll * P.second);
    Add(1, 1, n, 1, n, -P.second);
  }
}
int main() {
  cin >> n >> q;
  for (int i = 2, p, w; i <= n; i++)
    scanf("%d%d", &p, &w), E[p].push_back(make_pair(i, w));
  for (int i = 1, x, l, r; i <= q; i++)
    scanf("%d%d%d", &x, &l, &r), Q[x].push_back(make_pair(i, make_pair(l, r)));
  dfs(1);
  buildtree(1, 1, n);
  dfscalc(1);
  for (int i = 1; i <= q; i++) cout << ans[i] << endl;
}
