#include<bits/stdc++.h>
using namespace std;
int n,u,v,q,l,r,k,cnt,fa[5010],f[5010],dp[5010][5010],son[5010],de[5010],s[5010],tp[5010];
struct node{
	int to,next;
}e[10010];
void add(int u,int v){
	cnt++;
	e[cnt].next=fa[u];
	e[cnt].to=v;
	fa[u]=cnt;
}
void dfs(int x){
	s[x]++;
	int z=0;
	for(int i=fa[x];i;i=e[i].next){
		if(e[i].to==f[x])continue;
		f[e[i].to]=x;
		de[e[i].to]=de[x]+1;
		dfs(e[i].to);
		if(s[e[i].to]>s[z]){
			z=e[i].to;
			son[x]=z;
		}
		s[x]+=s[e[i].to];
	}
}
void dfs1(int x,int top){
	if(son[x]){
		tp[son[x]]=top;
		dfs1(son[x],top);
	}
	for(int i=fa[x];i;i=e[i].next){
		if(e[i].to==son[x]||e[i].to==f[x])continue;
		tp[e[i].to]=e[i].to;
		dfs1(e[i].to,e[i].to);
	}
}
int query(int x,int y){
	while(tp[x]!=tp[y]){
		if(de[tp[x]]<de[tp[y]]){
			swap(x,y);
		}
		if(tp[x]==x){
			x=f[tp[x]];
		}
		else{
			x=tp[x];
		}
	}
	return min(de[x],de[y]);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	de[1]=1;
	dfs(1);
	dfs1(1,1);
	for(int i=1;i<n;i++){
		dp[i][i]=i;
		for(int j=i+1;j<=n;j++){
			dp[i][j]=query(dp[i][j-1],j);
		}
	}
	cin>>q;
	for(int i=1;i<=q;i++){
		int ans=0;
		cin>>l>>r>>k;
		if(l>r){
			swap(l,r);
		}
		for(int j=l;j<=r-k+1;j++){
			ans=max(ans,dp[j][j+k-1]);
		}
		cout<<ans<<endl;
	}
}
