#include<bits/stdc++.h>
#define ll long long
#define db double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pdd pair<db,db>
#define F first
#define S second
#define pb push_back
using namespace std;
const int N=5e5+5;
int n,u,v,Q,ql,qr,qk,cntd[N],top[N],id[N],dep[N],son[N],siz[N],pa[N],Siz,ans,tr[N*4],tg[N*4],tr1[N*4];
bool istln;
vector<int> e[N];
void dfs(int cur,int fa){
	pa[cur]=fa;
	dep[cur]=dep[fa]+1;
	++cntd[dep[cur]];
	if(cntd[dep[cur]]>1) istln=1;
	siz[cur]=1;
	for(int to:e[cur]) if(to!=fa){
		dfs(to,cur);
		if(siz[to]>siz[son[cur]]) son[cur]=to;
		siz[cur]+=siz[to];
	}
}
void dfs1(int cur,int tp){
	top[cur]=tp;
	id[cur]=++Siz;
//	printf("*%d %d %d %d\n",cur,tp,id[cur],son[cur]);
	if(!son[cur]) return;
	dfs1(son[cur],tp);
	for(int to:e[cur]) if(!top[to]) dfs1(to,to);
}
void pushdown(int x){
	if(!tg[x]) return;
	tr[x<<1]+=tg[x];
	tr[x<<1|1]+=tg[x];
	tg[x<<1]+=tg[x];
	tg[x<<1|1]+=tg[x];
	tg[x]=0;
}
void updt(int x,int l,int r,int L,int R,int c){
//	printf("%d %d %d %d %d\n",x,l,r,L,R);
	if(L<=l && r<=R){
		tr[x]+=c;
		tg[x]+=c;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x);
	if(L<=mid) updt(x<<1,l,mid,L,R,c);
	if(R>mid) updt(x<<1|1,mid+1,r,L,R,c);
	tr[x]=max(tr[x<<1],tr[x<<1|1]);
}
void updt1(int x,int l,int r,int p,int c){
//	printf("%d %d %d %d %d\n",x,l,r,L,R);
	if(l==r){
		tr1[x]+=c;
		tg[x]+=c;
		return;
	}
	int mid=(l+r)>>1;
	if(p<=mid) updt1(x<<1,l,mid,p,c);
	else updt1(x<<1|1,mid+1,r,p,c);
	tr1[x]=max(tr1[x<<1],tr1[x<<1|1]);
}
int query(int x,int l,int r,int p){
//	printf("*%d %d %d %d %d\n",x,l,r,tr[x],p);
	if(l==r) return tr[x];
	int mid=(l+r)>>1;
	pushdown(x);
	if(p<=mid) return query(x<<1,l,mid,p);
	else return query(x<<1|1,mid+1,r,p); 
}
int query1(int x,int l,int r,int L,int R){
//	printf("*%d %d %d %d %d\n",x,l,r,tr[x],p);
	if(L<=l && r<=R) return tr[x];
	int mid=(l+r)>>1,res=0;
	if(L<=mid) res=max(res,query1(x<<1,l,mid,L,R));
	if(R>mid) res=max(res,query1(x<<1|1,mid+1,r,L,R));
	return res;
}
void mdf(int l,int r,int c){
	while(top[l]!=top[r]){
		if(dep[top[l]]>dep[top[r]]) swap(l,r);
		updt(1,1,n,id[top[r]],id[r],c);
		r=pa[top[r]];
	}
	if(dep[l]>dep[r]) swap(l,r);
	updt(1,1,n,id[l],id[r],c);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;++i){
		scanf("%d%d",&u,&v);
		e[u].pb(v);
		e[v].pb(u);
	}
	dfs(1,0);
	dfs1(1,1);
	scanf("%d",&Q);
	if(istln){
		while(Q--){
			scanf("%d%d%d",&ql,&qr,&qk);
			for(int i=ql;i<ql+qk;++i) mdf(1,i,1);
			ans=0;
			for(int i=1;i<=n;++i) if(query(1,1,n,id[i])==qk) ans=max(ans,dep[i]);
			for(int i=ql+qk;i<=qr;++i){
				mdf(1,i-qk,-1);
				mdf(1,i,1);
				for(int j=1;j<=n;++j) if(query(1,1,n,id[j])==qk) ans=max(ans,dep[j]);
			}
			for(int i=qr-qk+1;i<=qr;++i) mdf(1,i,-1);
			printf("%d\n",ans);
		}
	}
	else{
		for(int i=1;i<=n;++i) updt1(1,1,n,i,dep[i]);
		while(Q--){
			scanf("%d%d%d",&ql,&qr,&qk);
			printf("%d\n",query1(1,1,n,ql,qr));
		}
	}
	return 0;
}


