#include<iostream>
#include<queue>
#include<algorithm>
#include<math.h>
#include<string.h>
#define N 500005
#define INF 0x3f3f3f3f3f3f3f
using namespace std;
long long dis1[N];
bool isl[N];
int head[N],h[N],maxn[N],n;
struct edge{
	int next,v,w;
}e[N*2];
int tot=0;


struct query{
	int i,u,l,r;
	long long ans;
}q[N];

void add(int u, int v, long long w){
	e[++tot]=(edge){head[u],v,w};
	head[u]=tot;
}

class segtree{
public:
	long long t[N*4],tag[N*4];
	void update(int k){
		t[k]=min(t[k*2],t[k*2+1]);
	}
	void build(int k, int l, int r){
		if (l==r) {
			t[k]=(isl[l]?dis1[l]:INF);
			return;
		}
		int m=(l+r)/2;
		build(k*2,l,m);
		build(k*2+1,m+1,r);
		update(k);
	}
	void push_down(int k){
		tag[k*2]+=tag[k];t[k*2]+=tag[k];
		tag[k*2+1]+=tag[k];t[k*2+1]+=tag[k];
		tag[k]=0;
	}
	void change(int k, int l, int r, int left, int right, long long c){
		if (l>right||r<left){
			return;
		}
		if (left<=l&&r<=right){
			tag[k]+=c;
			t[k]+=c;
			return;
		}
		if (tag[k]) push_down(k);
		int m=(l+r)/2;
		change(k*2,l,m,left,right,c);
		change(k*2+1,m+1,r,left,right,c);
		update(k);
	} 
	long long query(int k, int l, int r, int left, int right){
		if (l>right||r<left){
			return INF;
		}
		if (left<=l&&r<=right){
			return t[k];
		}
		if (tag[k]) push_down(k);
		int m=(l+r)/2;
		return min(query(k*2,l,m,left,right),query(k*2+1,m+1,r,left,right) );
	}
}t;

void dfs(int u, int f){
	maxn[u]=u;
	bool flag=false;
	for (int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if (v!=f){
			flag=true;
			dis1[v]=dis1[u]+e[i].w;
			dfs(v,u);
			maxn[u]=max(maxn[u],maxn[v]);
		}
	}
	if (!flag) isl[u]=true;
	return; 
}

bool cmp(query a, query b){
	return a.u<b.u;
}
bool cmp2(query a, query b){
	return a.i<b.i;
}

void dfs2(int u, int f){
	for (int i=h[u];i<=n;i++){
		if (q[i].u==u){
			q[i].ans=t.query(1,1,n,q[i].l,q[i].r);
		}
		else break; 
	}
	for (int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if (v!=f){
			t.change(1,1,n,v,maxn[v],-1*e[i].w);
			if (v!=1) t.change(1,1,n,1,v-1,e[i].w);
			if (maxn[v]!=n) t.change(1,1,n,maxn[v]+1,n,e[i].w);
			dfs2(v,u);
			t.change(1,1,n,v,maxn[v],e[i].w);
			if (v!=1) t.change(1,1,n,1,v-1,-1*e[i].w);
			if (maxn[v]!=n) t.change(1,1,n,maxn[v]+1,n,-1*e[i].w);
		}
	}
}
int main(){
	memset(head,0,sizeof(head)); 
	int Q;
	cin>>n>>Q;
	
	int p;
	long long w;
	
	for (int i=2;i<=n;i++){
		cin>>p>>w;
		add(i,p,w);
		add(p,i,w);
	}
	dis1[1]=0;
	dfs(1,-1);
	t.build(1,1,n);
	
	for (int i=1;i<=Q;i++){
		cin>>q[i].u>>q[i].l>>q[i].r;
		q[i].i=i;
	}
	sort(q+1,q+1+Q,cmp);
	for (int i=1;i<=Q;i++){
		if (i==1||q[i].u!=q[i-1].u) h[q[i].u]=i;
	}
	
	dfs2(1,-1);
	sort(q+1,q+1+Q,cmp2);
	for (int i=1;i<=Q;i++){
		cout<<q[i].ans<<endl;
	}
	return 0;
}