#include<bits/stdc++.h>
//呜呜
//si le. 
//tie tie aqua
//5.20 - 12.6 200 days
using namespace std;
const int N1=5050,N=5e5+5;
#define sht short
struct segtree{
	struct node{
		sht l,r;
		sht lm,rm,mm;//左边最多几个连续 右边最多几个 中间最多几个 
		bool m;//有没有左右联通 
	}a[N1<<2];
	#define lc(p) (p<<1)
	#define rc(p) ((p<<1)|1)
	void build(int p,int l,int r){
		a[p].l=l;
		a[p].r=r;
		if(l==r)return;
		int mid=(l+r)>>1;
		build(lc(p),l,mid);
		build(rc(p),mid+1,r);
	}
	void pu(int p){
		a[p].lm=a[lc(p)].lm;
		if(a[lc(p)].m)a[p].lm+=a[rc(p)].lm;
		a[p].rm=a[rc(p)].rm;
		if(a[rc(p)].m)a[p].rm+=a[lc(p)].rm;
		a[p].mm=max({a[lc(p)].mm,a[rc(p)].mm,(sht)(a[lc(p)].rm+a[rc(p)].lm)});
		if(a[p].mm==a[p].r-a[p].l+1)a[p].m=1;
		else a[p].m=0;
	}
	void upd(int p,int x,int ch){
		int l=a[p].l,r=a[p].r;
		if(r<x||l>x)return;
		if(l==r){
			a[p].lm=a[p].rm=a[p].mm=a[p].m=ch;
			return;
		}
		upd(lc(p),x,ch);
		upd(rc(p),x,ch);
		pu(p);
	}
	int que(int p,int l,int r,bool llim,bool rlim){
		int nl=a[p].l,nr=a[p].r;
		if(nr<l||nl>r)return 0;
		if(nl>=l&&nr<=r){
			if(llim){
				if(rlim){
					if(a[p].m)return a[p].mm;
					else return -65525;
				}else{
					return a[p].lm;
				}
			}else if(rlim){
				return a[p].rm;
			}else{
				return a[p].mm;
			}
		}
		if(rlim){
			return max(que(lc(p),l,r,llim,1)+que(rc(p),l,r,1,1),que(rc(p),l,r,0,1));
		}else if(llim){
			return max(que(rc(p),l,r,1,rlim)+que(lc(p),l,r,1,1),que(lc(p),l,r,1,0));
		}else{
			return max({que(lc(p),l,r,0,0),que(rc(p),l,r,0,0),que(lc(p),l,r,0,1)+que(rc(p),l,r,1,0)});
		}
	}
}st[N1];
sht n;
bool chd[N1][N1];
vector<sht>g[N1];
sht dep[N1];
vector<sht>lev[N1];
sht mxdep;
void dfs(sht x,sht l){
	dep[x]=dep[l]+1;
	lev[dep[x]].emplace_back(x);
	mxdep=max(mxdep,dep[x]);
	chd[x][x]=1;
	for(int y:g[x])if(y!=l){
		dfs(y,x);
		for(int i=1;i<=n;i++)chd[x][i]|=chd[y][i];
	}
	st[x].build(1,1,n);
	for(int i=1;i<=n;i++)if(chd[x][i])st[x].upd(1,i,1);
}
int main(){
//	system("FC query2.out query2.ans");
	ios::sync_with_stdio(0);cin.tie(0);
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	//真的不会了 
	//要是我调出 
	//不行 调不出来 
	cin>>n;
	for(int i=1;i<n;i++){
		sht u,v;cin>>u>>v;
		g[u].emplace_back(v);g[v].emplace_back(u);
	}
	dfs(1,0);
	int q;cin>>q;
	while(q--){
		int ll,rr,k;cin>>ll>>rr>>k;
		int l=1,r=mxdep;
		while(l<r){
			int mid=((l+r+1)>>1);
			bool f=0;
			for(int x:lev[mid]){
				//cerr<<x<<" "<<ll<<" "<<rr<<" "<<st[x].que(1,ll,rr,0,0)<<endl;
				if(st[x].que(1,ll,rr,0,0)>=k){
					f=1;break;
				}
			}
			if(f){
				l=mid;
			}else{
				r=mid-1;
			}
		}
		cout<<l<<"\n";
	}
	return 0;
}
/*
12:46 meixiwangle

xiamiandefenxiyouwentibuguanlewoyaoxie20bufenfen

12:00 buzhidaonelixiecuole





可以分层开多个不知道啥
存下这一层和以下的所有的点集
就可以二分了

但是我不知道用什么维护

要可以加点和判断是否存在[l,r]中的连续k个数
 
好像 线段树可行 
 
这样正常存空间要炸
 
怎么办 


在线段树加点的同时有 q 个询问

如果满足 [l,r] 存在连续 k 个数

可以把询问拆成多个要求？

这个区间左/右第一次达成连续k个数的tsp

这个区间第一次达成内部 k 个数的tsp 

空间从 n 变成 n log n 
*/
