#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define MP make_pair
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
using namespace std;
const int N=5e5+10,M=1e6+10,mod=998244353;
int n,q;
vector<int> e[N];
bool vis[N];
int a[N];
struct Qry{
	int l,r,k;
}p[N];
int ans[N];
namespace sub1{
	int LCA[5030][5030],dep[N],fa[N];
	inline int lca(int x,int y){
		if(dep[x]<dep[y]) swap(x,y);
		if(x==y) return x;
		if(LCA[x][y]) return LCA[x][y];
		return LCA[x][y]=lca(fa[x],y);
	}
	void dfs(int u,int F){
		dep[u]=dep[F]+1;fa[u]=F;
		for(int v:e[u]) if(v!=F){
			dfs(v,u);
		}
	}
	int b[5030];
	struct Seg{
		int s[20030];
		inline void ph(int rt){s[rt]=max(s[rt<<1],s[rt<<1|1]);}
		inline void build(int rt,int l,int r){
			if(l==r) return s[rt]=b[l],void();
			int mid=(l+r)>>1;
			build(rt<<1,l,mid),build(rt<<1|1,mid+1,r);
			ph(rt);
		}
		inline int q(int rt,int l,int r,int ql,int qr){
			if(ql<=l&&r<=qr) return s[rt];
			int mid=(l+r)>>1,res=0;
			if(ql<=mid) res=q(rt<<1,l,mid,ql,qr);
			if(qr>mid) res=max(res,q(rt<<1|1,mid+1,r,ql,qr));
			return res;
		}
		inline int q(int l,int r){return l>r?0:q(1,1,n,l,r);}
	}t[5030];
}
int deg[N];
namespace sub2{
	int c[N],ct;
	void dfs2(int u,int F){
		c[++ct]=u;
		for(int v:e[u]) if(v!=F) dfs2(v,u);
	}
	int Rt[N];
	int s[N*21],lc[N*21],rc[N*21],tot;
	inline void upd(int &rt,int lst,int l,int r,int p){
		rt=++tot;
		s[rt]=s[lst]+1,lc[rt]=lc[lst],rc[rt]=rc[lst];
		if(l==r) return ;
		int mid=(l+r)>>1;
		if(p<=mid) upd(lc[rt],lc[lst],l,mid,p);
		else upd(rc[rt],rc[lst],mid+1,r,p);
	}
	inline int qR(int rt,int l,int r,int ql,int qr){
		if(!rt||!s[rt]) return 0;
		if(qr<l||ql>r) return 0;
		if(l==r) return l;
		int mid=(l+r)>>1;
		if(ql<=l&&r<=qr){
			if(s[rc[rt]]) return qR(rc[rt],mid+1,r,ql,qr);
			else return qR(lc[rt],l,mid,ql,qr);
		}
		int res=qR(rc[rt],mid+1,r,ql,qr);
		if(res) return res;
		return qR(lc[rt],l,mid,ql,qr);
	}
	inline int qry(int rt,int l,int r,int ql,int qr){
		if(!rt||!s[rt]) return 0;
		if(ql<=l&&r<=qr)return s[rt];
		int mid=(l+r)>>1,res=0;
		if(ql<=mid) res=qry(lc[rt],l,mid,ql,qr);
		if(qr>mid) res+=qry(rc[rt],mid+1,r,ql,qr);
		return res;
	}
	inline int qL(int rt,int l,int r,int ql,int qr){
//		cerr<<rt<<' '<<l<<' '<<r<<' '<<ql<<' '<<qr<<'\n';
		if(!rt||!s[rt]) return n+1;
		if(qr<l||ql>r) return n+1;
		if(l==r) return l;
		int mid=(l+r)>>1;
		if(ql<=l&&r<=qr){
			if(s[lc[rt]]) return qL(lc[rt],l,mid,ql,qr);
			else return qL(rc[rt],mid+1,r,ql,qr);
		}
		int res=qL(lc[rt],l,mid,ql,qr);
		if(res!=n+1) return res;
		return qL(rc[rt],mid+1,r,ql,qr);
	}
	void solve(){
		dfs2(1,0);
		for(int i=n;i;i--) upd(Rt[i],Rt[i+1],1,n,c[i]);
		for(int i=1,l,r,k;i<=q;i++){
			cin>>l>>r>>k;
			int L=1,R=n,ans=1;
			while(L<=R){
				int mid=(L+R)>>1;
				if(qry(Rt[mid],1,n,l,r)>=k) L=mid+1,ans=mid;
				else R=mid-1;
			}
			cout<<ans<<'\n';
		}
	}
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		e[u].pb(v),e[v].pb(u);
		deg[u]++,deg[v]++;
	}
	bool flag=deg[1]==1;
	for(int i=2;i<=n;i++) flag&=deg[i]<=2;
	cin>>q;
	if(n<=5000&&q<=5000){
		sub1::dfs(1,0);
		for(int i=1;i<=q;i++) cin>>p[i].l>>p[i].r>>p[i].k;
		for(int i=1;i<=n;i++){
			int v=i;
			for(int j=1;j<i;j++) sub1::b[j]=0;
			for(int j=i;j<=n;j++){
				v=sub1::lca(v,j);
				int d=sub1::dep[v];
				sub1::b[j]=d;
			}
			sub1::t[i].build(1,1,n);
		}
		for(int i=1;i<=q;i++){
			int l=p[i].l,r=p[i].r,k=p[i].k;
			int res=0;
			for(int j=l;j<=r;j++){
				int x=j+k-1;
				res=max(res,sub1::t[j].q(x,r));
			}
			ans[i]=res;
		}
		for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
	}
	else if(flag){
		sub2::solve();
	}
	return 0;
}
