/*

//freopen("query2.in","w","stdout");
//freopen("query.txt","r",stdin);
freopen("adit.in","r",stdin)
freopen("asign.in","r",stdin)
int mian()
return 1;
kkkcs03
lin_toto
#include<bits\stdc++.h>
int x1,y1;
int size;
cout<<rand()<<'\n';
__int64 n;
while(1){}
while(true){}
I love ccf
I love NOIp

考场不是给你写回忆录的地方，请尊重你通过漫长的训练换来的考试机会

10:25 通过前两题大样例 

10:30 T3好难，放弃T3

10:42 T4好难，拿32pts跑路 

11:10 写写停停地打完了2.4k的树剖+线段树，此时还有110min结束 

目测：
T1黄
 
T2绿

T3不知道因为没想

T4性质B绿，性质A蓝，整体蓝或紫 

那我232真能全国前20%吗？

感觉旁边几个人全都好强，对面的人也好强，感觉T3T4起码也打出了特殊性质 

更不用说高中生了..

反正拿不了奖 
*/

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100100;
int n,q;
struct egde{
	int nxt,to;
}e[N*2];
int cnt,head[N];
inline void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int top[N],son[N],siz[N],dep[N],fa[N];
inline void dfs1(int u,int f){
	siz[u]=1,dep[u]=dep[f]+1,fa[u]=f;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v; 
	}
	return;
}
inline void dfs2(int u,int f){
	if(son[f]==u) top[u]=top[f];
	else top[u]=u;
	if(son[u]) dfs2(son[u],u);
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f || v==son[u]) continue;
		dfs2(v,u);
	}
	return;
}
int LCA(int x,int y){
	if(x==0) return y;
	if(y==0) return x;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return x;
}
int tree[N*4];
inline void push_up(int x){
	tree[x]=LCA(tree[x*2],tree[x*2+1]);
}
inline void build(int l,int r,int x){
	if(l==r){
		tree[x]=l;
		return;
	}
	int mid=l+r>>1;
	build(l,mid,x*2);
	build(mid+1,r,x*2+1);
	push_up(x);
	return;
}
int query(int l,int r,int L,int R,int x){
	if(l>=L && r<=R) return tree[x];
	int mid=l+r>>1,ans=0;
	if(mid>=L) ans=LCA(ans,query(l,mid,L,R,x*2));
	if(mid+1<=R) ans=LCA(ans,query(mid+1,r,L,R,x*2+1));
	return ans;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v); add(v,u);
	}
	dfs1(1,0); dfs2(1,0);
	build(1,n,1);
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r,k;
		cin>>l>>r>>k;
		int ans=0;
		for(int i=l;i+k-1<=r;i++){
			int lca=query(1,n,i,i+k-1,1);
			ans=max(ans,dep[lca]);
		}
		cout<<ans<<'\n';
	}
	return 0;
}
