#include<bits/stdc++.h>
using namespace std;
const int N=5e5+100,bas=25;
int n,q;
vector<int>g[N];
int fa[bas][N],dep[N];
void build(int p,int fat){
//	cout<<p<<' ';
	fa[0][p]=fat;
	dep[p]=dep[fat]+1;
	for(int i=1;i<bas;i++)fa[i][p]=fa[i-1][fa[i-1][p]];
	int si=g[p].size();
	for(int i=0;i<si;i++){
		if(g[p][i]!=fat){
			build(g[p][i],p);
		}
	}
}
int LCA(int x,int y){
	if(x==0)return y;
	if(y==0)return x;
	if(x==y)return x;
	if(dep[y]<dep[x])swap(x,y);
	for(int i=bas-1;i>=0;i--){
		if(dep[fa[i][y]]>=dep[x])y=fa[i][y];
	}
	if(x==y)return x;
	for(int i=bas-1;i>=0;i--){
		if(fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
	}
	return fa[0][x];
}
struct point{
	int l,r,val;
};
point P(int l,int r,int val){
	return (point ){l,r,val};
} 
struct SGT{
	point tr[N*8];
	int ans=0;
	int build(int p,int l,int r){
		if(l==r){
			tr[p]=P(l,r,l);
			return l;
		}
		int mid=(l+r)>>1;
		tr[p]=P(l,r,LCA(build(p*2,l,mid),build(p*2+1,mid+1,r)));
		return tr[p].val;
	}
	
	void query(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R){
			ans=LCA(ans,tr[p].val);
			return;
		}
		int mid=(l+r)>>1;
		if(L<=mid)query(p*2,l,mid,L,R);
		if(R>mid)query(p*2+1,mid+1,r,L,R);
	}
	int ask(int l,int r){
		ans=0;
		query(1,tr[1].l,tr[1].r,l,r);
		return ans;
	}
}t;

int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dep[1]=1;
	build(1,1);
	t.build(1,1,n);
	int q;
	scanf("%d",&q);
	while(q--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		if(k==(r-l+1))printf("%d\n",dep[t.ask(l,r)]-1);
		else{
			int maxx=0;
			for(int i=l;i+k-1<=r;i++){
				maxx=max(maxx,dep[t.ask(i,i+k-1)]);
			}
			printf("%d\n",maxx-1);
		}
	} 
}
