/*
首先注意到一个性质
对于点集 V
如果往里面加新的点，那么 V 的 LCA 的深度是单调不增的
所以显然我们只需要 check 长度恰好为 K 的子区间
那么考虑最暴力的做法，O(N^2 log N) 的处理每个问询的答案，可以通过 n,Q<=500 的数据
获得 8 pts 的好成绩! 

然后考虑性质 A
树的形态是一条链
我们先算每个节点的深度
然后做如下转化
有一个序列 d1~dn
它是 1~n 的排列，并且保证 d1=1
每次问一个区间 [l,r] ，问里面所有长度 >=K 的子区间 [l',r'] 的区间最小值中的最大值是多少
考虑二分答案
我们二分 v 然后判断能否找到一个长度 >=K 的子区间，使得这个子区间的最小值至少是 v

现在看来特殊性质 A 不是很好写的样子

考虑 n,Q<=5000 的情况
需要在 O(N log N) 左右回答每个问询
由于 lca 是可重复贡献的
考虑倍增优化
处理出 act[u][i] 表示 [u,u+2^i-1] 内的元素在树上的 lca 是哪个节点
这个东西可以在 O(N log^2 N) 的时间内预处理出来
然后对每个问询，我们枚举左端点 l ，快速计算长度为 K 的子区间的 lca 是哪个节点
我们可以在 O(N log^2 N) 的时间内得出答案 

*/
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,nQ;
struct edge{int to,nxt;}e[N<<1];
int hd[N],nE=0;
void addedge(int u,int v){e[++nE]=(edge){v,hd[u]};hd[u]=nE;}
int dep[N],p[N],sz[N],son[N];
int top[N],dfn[N],timer=0;
int LOG2[N];

void dfs_son(int u,int fa){
	p[u]=fa;
	dep[u]=dep[fa]+1;
	sz[u]=1;
	son[u]=0;
	for(int i=hd[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa)continue;
		dfs_son(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]])son[u]=v; 
	}
}

void dfs_top(int x,int tp){
	top[x]=tp;
	dfn[x]=++timer;
	if(son[x])dfs_top(son[x],tp);
	for(int i=hd[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==p[x]||y==son[x])continue;
		dfs_top(y,y);
	}
}

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

namespace subtask1{
	void solve(){
		int l,r,K,w,ans;
		while(nQ--){
			cin>>l>>r>>K;
			ans=-1;
			for(int i=l;i+K-1<=r;i++){
				w=i;
				for(int j=2;j<=K;j++)w=lca(w,i+j-1);
				ans=max(ans,dep[w]);
			}
			cout<<ans<<"\n";
		}
	}
}

namespace subtask2{
	int act[25][N];int L;
	int raq(int l,int r){
		int t=LOG2[r-l+1];
		return lca(act[t][l],act[t][r-(1<<t)+1]);
	}
	
	void solve(){
		LOG2[1]=0;
		for(int i=2;i<=n;i++)LOG2[i]=LOG2[i>>1]+1;
		L=LOG2[n];
		for(int i=1;i<=n;i++)act[0][i]=i;
		for(int j=1;j<=L;j++)
			for(int i=1;i+(1<<j)-1<=n;i++)
				act[j][i]=lca(act[j-1][i],act[j-1][i+(1<<(j-1))]);
		
		int ql,qr,K,r,w;
		int ans;
		while(nQ--){
			cin>>ql>>qr>>K;
			ans=0;
			for(int l=ql;l+K-1<=qr;l++){
				r=l+K-1;
				w=raq(l,r);
				ans=max(ans,dep[w]);
			}
			cout<<ans<<"\n";
		}
	}
}

int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		addedge(u,v);addedge(v,u);
	}
	dfs_son(1,0);
	dfs_top(1,1);
	cin>>nQ;
	
	if(n<=500&&nQ<=500)
		subtask1::solve();
	else 
		subtask2::solve(); 

	return 0;
}

