#include<iostream>
#include<cstring>
using namespace std;
const int N=5e3+5,MaxM=N*2;
int n,q,f[N][N];
int h[N],idx;
struct edge{
	int to,next;
}e[MaxM];
void add(int a,int b){
	e[idx].to=b,e[idx].next=h[a],h[a]=idx++;
}
int dep[N],fa[N][24];
void dfs(int u,int Fa){
	dep[u]=dep[Fa]+1;
	for(int i=1;i<=20;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int j=h[u];~j;j=e[j].next){
		int v=e[j].to;
		if(v==Fa) continue;
		fa[v][0]=u;
		dfs(v,u);
	}
}
int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=22;i>=0;i--){
		if(dep[fa[x][i]]>=dep[y]){
			x=fa[x][i];
		}
	}
	if(x==y) return x;
	for(int i=22;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		}
	}
	return fa[x][0];
}
int get(int l,int r){
	if(l==r) return dep[l];
	int lca=LCA(l,l+1);
	for(int i=l+2;i<=r;i++) lca=LCA(lca,i);
	return dep[lca];
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0); 
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>n;
	memset(h,-1,sizeof h);
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v),add(v,u);
	}
	dfs(1,0);
	int judge=0;
	for(int i=1;i<=n;i++){
		if(dep[i]==n){
			judge=1;
			break;
		}
	}
	for(int i=1;i<=n;i++){
		f[i][i]=i;
		for(int j=i+1;j<=n;j++){
			f[i][j]=LCA(f[i][j-1],j);
		}
	}
	cin>>q;
	while(q--){
		int l,r,k;
		cin>>l>>r>>k;
		int ans=0;
		for(int i=l;i+k-1<=r;i++){
			ans=max(ans,dep[f[i][i+k-1]]);
		}
		cout<<ans<<'\n';
	}
	return 0;
}
