#include<bits/stdc++.h>
#define N 500007

using namespace std;

inline int read(){
	int ret=0;char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<3)+(ret<<1)+c-'0',c=getchar();
	return ret;
}
void write(int x){
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

int n,q,ans[N];
vector<int> G[N],V[N];
struct query{int l,r,k,id;}qry[N],qry_[N];

namespace LCA{
	int fa[N],dep[N],idx,dfn[N],num[N],st[20][N];
	void dfs(int u){
		dep[u]=dep[fa[u]]+1,num[dfn[u]=++idx]=u;
		for(auto v:G[u]) if(v!=fa[u]) fa[v]=u,dfs(v);
	}
	inline int Min(int x,int y) {return dep[x]<dep[y]?x:y;}
	inline void init(){
		dfs(1);
		for(int i=1;i<=n;i++) st[0][i]=fa[num[i]];
		for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++) st[i][j]=Min(st[i-1][j],st[i-1][j+(1<<i-1)]);
	}
	inline int get(int x,int y){
		if(x==y) return x;
		if((x=dfn[x])>(y=dfn[y])) swap(x,y);
		x++;int l=__lg(y-x+1);
		return Min(st[l][x],st[l][y-(1<<l)+1]);
	}
}

namespace SGT{
	inline int Max(int x,int y) {return x>y?x:y;}
	struct node{
		int mx,lmx,rmx,len;
		node() {mx=lmx=rmx=len=0;}
		node(int x) {mx=lmx=rmx=x,len=1;}
		inline node operator+(node x)const{
			node ret;
			ret.len=len+x.len;
			ret.mx=Max(Max(mx,x.mx),rmx+x.lmx);
			ret.lmx=(lmx==len?lmx+x.lmx:lmx),ret.rmx=(x.rmx==x.len?rmx+x.rmx:x.rmx);
			return ret;
		}
	}tr[N<<2];
	#define mid (l+r>>1)
	#define lc (u<<1)
	#define rc (u<<1|1)
	void build(int u,int l,int r){
		if(l==r) return tr[u]=node(1),void();
		build(lc,l,mid),build(rc,mid+1,r);
		tr[u]=tr[lc]+tr[rc];
	}
	void mtf(int u,int l,int r,int x,int val){
		if(l==r) return tr[u]=node(val),void();
		if(x<=mid) mtf(lc,l,mid,x,val);
		else mtf(rc,mid+1,r,x,val);
		tr[u]=tr[lc]+tr[rc];
	}
	node query(int u,int l,int r,int L,int R){
		if(l>=L&&r<=R) return tr[u];
		if(L>mid) return query(rc,mid+1,r,L,R);
		if(R<=mid) return query(lc,l,mid,L,R);
		return query(lc,l,mid,L,R)+query(rc,mid+1,r,L,R);
	}
	#undef mid
	#undef lc
	#undef rc
}

void solve(int l,int r,int L,int R){
	if(L>R) return;
	if(l==r) {for(int i=L;i<=R;i++) ans[qry[i].id]=l;return;}
	int mid=(l+r)/2;
	for(int i=l;i<=mid;i++) for(auto u:V[i]) SGT::mtf(1,1,n-1,u,0);
	int L_=L,R_=R;
	for(int i=L;i<=R;i++){
		if(SGT::query(1,1,n-1,qry[i].l,qry[i].r-1).mx>=qry[i].k-1) qry_[R_--]=qry[i];
		else qry_[L_++]=qry[i];
	}
	for(int i=L;i<=R;i++) qry[i]=qry_[i];
	solve(mid+1,r,L_,R);
	for(int i=l;i<=mid;i++) for(auto u:V[i]) SGT::mtf(1,1,n-1,u,1);
	solve(l,mid,L,R_);
}

int st[20][N];
inline int Query(int l,int r){
	int l_=__lg(r-l+1);
	return max(st[l_][l],st[l_][r-(1<<l_)+1]);
}

void mian(){
	n=read();
	for(int i=1;i<=n;i++) G[i].clear(),V[i].clear();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		G[u].push_back(v),G[v].push_back(u);
	}
	LCA::init();
	for(int i=1;i<n;i++) V[LCA::dep[LCA::get(i,i+1)]].push_back(i);
	for(int i=1;i<=n;i++) st[0][i]=LCA::dep[i];
	for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++) st[i][j]=max(st[i-1][j],st[i-1][j+(1<<i-1)]);
	int q_=read();q=0;
	for(int i=1;i<=q_;i++){
		int l=read(),r=read(),k=read();
		if(k==1) ans[i]=Query(l,r);
		else q++,qry[q].l=l,qry[q].r=r,qry[q].k=k,qry[q].id=i;
	}
	if(n==1) {for(int i=1;i<=q_;i++) puts("1");return;}
	SGT::build(1,1,n-1);
	solve(1,n,1,q);
	for(int i=1;i<=q_;i++) write(ans[i]),puts("");
}

int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int T=1;
	while(T--) mian();
	return 0;
}
