#include<bits/stdc++.h>
using namespace std;

template<typename _T>
inline _T read(){
	_T res=0;
	char c=getchar();
	while(!isdigit(c)){
		c=getchar();
	}
	while(isdigit(c)){
		res=(res<<1)+(res<<3)+(c^48);
		c=getchar();
	}
	return res;
}

const int MAXN=5e5+5;

int n;
vector<int>e[MAXN];
int q;
int dep[MAXN],top[MAXN],son[MAXN],siz[MAXN],fa[MAXN];
int st[MAXN][32];
int lg2[MAXN];

void dfs1(int p,int f){
	siz[p]=1;
	dep[p]=dep[f]+1;
	int maxsiz=0;
	fa[p]=f;
	for(auto i:e[p]){
		if(i==f) continue;
		dfs1(i,p);
		if(siz[i]>maxsiz){
			maxsiz=siz[i];
			son[p]=i;
		}
		siz[p]+=siz[i];
	}
}

void dfs2(int p,int f,int tp){
	top[p]=tp;
	if(son[p]){
		dfs2(son[p],p,tp);
	}
	for(auto i:e[p]){
		if(i==son[p]||i==f) continue;
		dfs2(i,p,i);
	}
}

int lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]){
			swap(u,v);
		}
		u=fa[top[u]];
	}
	return dep[u]>dep[v]?v:u;
}

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

int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	
	
	n=read<int>();
	
	lg2[0]=-1e9;
	lg2[1]=0;
	for(int i=2;i<=n;i++){
		lg2[i]=lg2[i>>1]+1; 
	}
	
	for(int i=1;i<n;i++){
		int u=read<int>(),v=read<int>();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	
	dfs1(1,0);
	
	dfs2(1,0,1);
	
	for(int i=1;i<=n;i++){
		st[i][0]=i;
	}
	for(int i=1;(1<<i)<=n;i++){
		for(int j=1;j+(1<<i)-1<=n;j++){
			st[j][i]=lca(st[j][i-1],st[j+(1<<(i-1))][i-1]);
		}
	}
	
	q=read<int>();
	
	while(q--){
		int l=read<int>(),r=read<int>(),k=read<int>();
		int maxdep=0;
		for(int i=l;i+k-1<=r;i++){
			int tmp=query(i,i+k-1);
			if(dep[tmp]>maxdep){
				maxdep=dep[tmp];
			}
		}
		printf("%d\n",maxdep);
	}
	
	return 0;
}
