#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=29;
struct chain_forward_star{int nxt,to;}edge[N<<1];
int fa[N][M],st[N][M],lg[N],head[N],dep[N],n,q,ecnt,T;
bool A;
int read(){
	int res=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9') res=res*10+ch-'0',ch=getchar();
	return res*f;
}
inline void add(int u,int v){edge[++ecnt]={head[u],v},head[u]=ecnt;}
void dfs(int u,int pre){
	dep[u]=dep[pre]+1,fa[u][0]=pre;int son=0;
	for(int i=1;i<M;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v!=pre) dfs(v,u),son++;
	}
	if(son>1) A=false;
}
int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=M-1;i>=0;i--){
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=M-1;i>=0;i--){
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
void init(bool opt){
	lg[0]=-1;
	for(int i=1;i<=n;i++){
		lg[i]=lg[i>>1]+1;
		if(opt) st[i][0]=dep[i];
		else st[i][0]=i;
	}
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			if(opt) st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
			else st[i][j]=LCA(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
	}
}
inline int query_LCA(int l,int r){
	int len=lg[r-l+1];
	return LCA(st[l][len],st[r-(1<<len)+1][len]);
}
inline int query_max(int l,int r){
	int len=lg[r-l+1];
	return max(st[l][len],st[r-(1<<len)+1][len]);
}
//要用主席树求区间第k大，但我不会qwq 
void furry(){
	n=read();
	for(int x,y,t=n;--t;){
		x=read(),y=read();
		add(x,y),add(y,x);
	}
	A=true,dfs(1,1),init(A),q=read();
	for(int l,r,k;q--;){
		l=read(),r=read(),k=read();
		if(A) printf("%d\n",query_max(l,r));
		else{
			int res=0;
			for(int i=l;i+k-1<=r;i++){
				res=max(res,dep[query_LCA(i,i+k-1)]);
			}
			printf("%d\n",res);
		}
	}
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	furry();
	fclose(stdin);fclose(stdout);
	return 0;
}
