#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int n,he[N],to[2*N],ne[2*N],cxt,q,f[N][25],st[N][25],dep[N],rev[N],lg[N],ans[N];

void add(int u,int v){
	cxt++;
	ne[cxt]=he[u];
	to[cxt]=v;
	he[u]=cxt;
}

int stck[N],w[N],top;

void dfs(){
	stck[1]=top=1;
	while(top){
		int o=stck[top],fa=w[top];
		top--;
		dep[o]=dep[fa]+1;
		rev[dep[o]]=o;
		f[o][0]=fa;
		for(int i=he[o];i;i=ne[i]){
			int u=to[i];
			if(u==fa) continue;
			stck[++top]=u,w[top]=o;
		}
	}
}

int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=lg[n]+1;i>=0;i--) if(f[u][i]&&dep[f[u][i]]>=dep[v]) u=f[u][i];
	if(u==v) return u;
	for(int i=lg[n]+1;i>=0;i--) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}

int ask(int l,int r){
	int len=r-l+1;
	if(len==1) return l;
	return lca(st[l][lg[len]],st[r-(1<<lg[len])+1][lg[len]]);
}

void forfst(){
	lg[0]=-1;
	for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int j=1;(1ll<<j)<=n;j++)
		for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1];
		
	for(int i=1;i<n;i++) st[i][1]=lca(i,i+1);
	
	for(int j=2;(1ll<<j)<=n;j++)
		for(int i=1;i+(1<<j-1)<=n;i++) st[i][j]=lca(st[i][j-1],st[i+(1<<j-1)][j-1]);
}

//lca:(1ll<<i)<=n
struct gg{
	int l,r,k,id;
}a[N],u[N],v[N];

struct tree{
	int add[4*N],ma[4*N],mi[4*N];
	void pushdown(int p){
		mi[2*p]+=add[p];
		mi[2*p+1]+=add[p];
		
		ma[2*p]+=add[p];
		ma[2*p+1]+=add[p];
		
		add[2*p]+=add[p];
		add[2*p+1]+=add[p];
		add[p]=0;
	}
	void change(int p,int L,int R,int l,int r,int x){
		if(L>r||R<l) return;
		if(l<=L&&R<=r){
			add[p]+=x;
			ma[p]+=x;
			mi[p]+=x;
			return;
		}
		pushdown(p);
		int mid=L+R>>1;
		change(2*p,L,mid,l,r,x);
		change(2*p+1,mid+1,R,l,r,x);
		ma[p]=max(ma[2*p],ma[2*p+1]);
		mi[p]=min(mi[2*p],mi[2*p+1]);
	}
	int askl(int p,int L,int R,int r){
		if(L>r||mi[p]>0) return 0;
		if(L==R) return L*(add[p]==0);
		pushdown(p);
		int mid=L+R>>1;
		int o=askl(2*p+1,mid+1,R,r);
		if(o) return o;
		return askl(2*p,L,mid,r);
	}
	int ask(int p,int L,int R,int l,int r){
		if(L>r||R<l) return 0;
		if(l<=L&&R<=r) return ma[p];
		pushdown(p);
		int mid=L+R>>1;
		return max(ask(2*p,L,mid,l,r),ask(2*p+1,mid+1,R,l,r));
	}
}tree;

void solve(int l,int r,int lp,int rp){//l/r答案区间   lp/rp询问区间 
//	if(dep>=21) cout<<'aaaa';
	if(l==r){
		for(int i=lp;i<=rp;i++) ans[a[i].id]=l;
		return;
	}
	int mid=l+r>>1;
	for(int i=mid+1;i<=r;i++){
		int o=rev[i];
		int ll=tree.askl(1,1,n,o-1)+1,rr=o;
		tree.change(1,1,n,ll,rr,tree.ask(1,1,n,o+1,o+1)+1);
	}
//	if(l==1&&r==n){
//		cout<<mid+1<<"\n";
//		for(int i=1;i<=n;i++) cout<<tree.ask(1,1,n,i,i)<<" ";
//		cout<<'\n';
//	}
	int top1=0,top2=0;
	for(int i=lp;i<=rp;i++){
		if(tree.ask(1,1,n,a[i].l,a[i].r-a[i].k+1)<a[i].k) u[++top1]=a[i];
		else v[++top2]=a[i];
//		if(l==1&&r==n) cout<<a[i].l<<" "<a[i].r<<" "<<a[i].k<<"  "<<tree.ask(1,1,n,a[i].l,a[i].r-a[i].k+1)<<"\n";
	}
	int cxt=lp-1;
	for(int i=1;i<=top1;i++) a[++cxt]=u[i];
	int MID=cxt;
	for(int i=1;i<=top2;i++) a[++cxt]=v[i];
	solve(l,mid,lp,MID);
	for(int i=mid+1;i<=r;i++){
		int o=rev[i];
		int ll=tree.askl(1,1,n,o-1)+1,rr=o;
		tree.change(1,1,n,ll,rr,-tree.ask(1,1,n,o+1,o+1)-1);
	}
	solve(mid+1,r,MID+1,rp);
//	cout<<r+1<<"\n";
//	for(int i=1;i<=n;i++) cout<<tree.ask(1,1,n,i,i)<<" ";
//	cout<<'\n';
}

int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs();
	forfst();
	cin>>q;
	bool pp=1;
	for(int i=1;i<=q;i++){
		cin>>a[i].l>>a[i].r>>a[i].k;
		a[i].id=i;
		if(a[i].k==a[i].r-a[i].l+1||(n<=5000&&q<=5000)){
			int ans=0;
			for(int p=a[i].l;p+a[i].k-1<=a[i].r;p++) ans=max(ans,dep[ask(p,p+a[i].k-1)]);
			cout<<ans<<"\n";
			pp=0;
		}
	}
	if(!pp) exit(0);
	solve(1,n,1,q);
	for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
