#include <bits/stdc++.h>
using namespace std;
const int N = 512345;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
int n, a, b;
long long val;
long long seg[4 * N], lazy[4 * N];
void prop(int r, int i, int j) {
  seg[r] += lazy[r];
  if (i != j) {
    lazy[2 * r] += lazy[r];
    lazy[2 * r + 1] += lazy[r];
  }
  lazy[r] = 0;
}
void update(int r, int i, int j) {
  prop(r, i, j);
  if (i > b or j < a) return;
  if (a <= i and j <= b) {
    lazy[r] = val;
    prop(r, i, j);
  } else {
    int m = (i + j) / 2;
    update(2 * r, i, m);
    update(2 * r + 1, m + 1, j);
    seg[r] = min(seg[2 * r], seg[2 * r + 1]);
  }
}
long long query(int r, int i, int j) {
  prop(r, i, j);
  if (i > b or j < a) return INF;
  if (a <= i and j <= b) {
    return seg[r];
  } else {
    int m = (i + j) / 2;
    long long L = query(2 * r, i, m);
    long long R = query(2 * r + 1, m + 1, j);
    return min(L, R);
  }
}
vector<int> leafs;
vector<pair<int, int>> g[N], que[N], to_update;
vector<tuple<int, int, int>> ord_que;
map<tuple<int, int, int>, long long> ans;
int tin[N], tout[N], tnow;
int get_comp(int x) {
  return lower_bound(leafs.begin(), leafs.end(), x) - leafs.begin();
}
void dfs1(int u, long long dist = 0) {
  tin[u] = ++tnow;
  sort(g[u].begin(), g[u].end());
  for (auto v : g[u]) {
    dfs1(v.first, dist + v.second);
  }
  if (g[u].size() == 0) {
    leafs.emplace_back(tin[u]);
    to_update.emplace_back(tin[u], dist);
  }
  tout[u] = tnow;
}
void dfs2(int u) {
  for (auto x : que[u]) {
    int l, r;
    tie(l, r) = x;
    a = get_comp(l);
    b = upper_bound(leafs.begin(), leafs.end(), r) - leafs.begin() - 1;
    ans[make_tuple(u, l, r)] = query(1, 0, N - 1);
  }
  for (auto v : g[u]) {
    a = get_comp(tin[v.first]);
    b = get_comp(tout[v.first]);
    val = -v.second;
    update(1, 0, N - 1);
    if (get_comp(tin[v.first]) - 1 >= 0) {
      a = 0;
      b = get_comp(tin[v.first]) - 1;
      val = v.second;
      update(1, 0, N - 1);
    }
    a = get_comp(tout[v.first]) + 1;
    b = get_comp(N - 1);
    val = v.second;
    update(1, 0, N - 1);
    dfs2(v.first);
    a = get_comp(tin[v.first]);
    b = get_comp(tout[v.first]);
    val = v.second;
    update(1, 0, N - 1);
    if (get_comp(tin[v.first]) - 1 >= 0) {
      a = get_comp(0);
      b = get_comp(tin[v.first]) - 1;
      val = -v.second;
      update(1, 0, N - 1);
    }
    a = get_comp(tout[v.first]) + 1;
    b = get_comp(N - 1);
    val = -v.second;
    update(1, 0, N - 1);
  }
}
int main(void) {
  scanf("%d", &n);
  int q;
  scanf("%d", &q);
  for (int i = 2; i <= n; i++) {
    int pai, wei;
    scanf("%d %d", &pai, &wei);
    g[pai].emplace_back(i, wei);
  }
  while (q--) {
    int v, l, r;
    scanf("%d %d %d", &v, &l, &r);
    que[v].emplace_back(l, r);
    ord_que.emplace_back(v, l, r);
  }
  dfs1(1);
  sort(leafs.begin(), leafs.end());
  for (auto x : to_update) {
    a = get_comp(x.first);
    b = get_comp(x.first);
    val = x.second;
    update(1, 0, N - 1);
  }
  dfs2(1);
  for (auto x : ord_que) {
    printf("%lld\n", ans[x]);
  }
  return 0;
}
