#include <bits/stdc++.h>
using namespace std;
const int M = 500005;
int n, q, p, w[M], v, l[M], r[M];
long long st[4 * M], lz[4 * M], ans[M], t[M];
vector<int> in[M], adj[M];
void push(int i, int j, int pos) {
  st[pos] += lz[pos];
  if (i < j) {
    lz[pos * 2] += lz[pos];
    lz[pos * 2 + 1] += lz[pos];
  }
  lz[pos] = 0;
}
void update(int i, int j, int pos, int a, int b, int k) {
  if (lz[pos]) push(i, j, pos);
  if (j < a || b < i) return;
  if (a <= i && j <= b) {
    lz[pos] = k;
    push(i, j, pos);
    return;
  }
  int m = (i + j) / 2;
  update(i, m, pos * 2, a, b, k);
  update(m + 1, j, pos * 2 + 1, a, b, k);
  st[pos] = min(st[pos * 2], st[pos * 2 + 1]);
}
long long query(int i, int j, int pos, int a, int b) {
  if (lz[pos]) push(i, j, pos);
  if (j < a || b < i) return 1e18;
  if (a <= i && j <= b) return st[pos];
  int m = (i + j) / 2;
  return min(query(i, m, pos * 2, a, b), query(m + 1, j, pos * 2 + 1, a, b));
}
void dfs(int st, int en) {
  if (1 < st) update(1, n, 1, 1, st - 1, w[st]);
  update(1, n, 1, st, en, -w[st]);
  if (en < n) update(1, n, 1, en + 1, n, w[st]);
  for (int i : in[st]) ans[i] = query(1, n, 1, l[i], r[i]);
  for (int i = 0; i < adj[st].size(); i++)
    dfs(adj[st][i], i + 1 == adj[st].size() ? en : adj[st][i + 1] - 1);
  if (1 < st) update(1, n, 1, 1, st - 1, -w[st]);
  update(1, n, 1, st, en, w[st]);
  if (en < n) update(1, n, 1, en + 1, n, -w[st]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    cin >> p >> w[i];
    adj[p].push_back(i);
    t[i] = t[p] + w[i];
  }
  for (int i = 0; i < q; i++) {
    cin >> v >> l[i] >> r[i];
    in[v].push_back(i);
  }
  for (int i = 1; i <= n; i++)
    update(1, n, 1, i, i, adj[i].size() ? 1e18 : t[i]);
  dfs(1, n);
  for (int i = 0; i < q; i++) cout << ans[i] << '\n';
  return 0;
}
