#include<bits/stdc++.h>
using namespace std;
struct SEG1{
	struct st{
		int l,r,c;
	}a[1048888];
	void bt(int x,int l,int r){
		a[x].l=l;
		a[x].r=r;
		a[x].c=1e9;
		if(l<r){
			bt(x<<1,l,(l+r>>1));
			bt(x<<1|1,(l+r>>1)+1,r);
		}
	}
	void px(int x,int p,int v){
		a[x].c=min(a[x].c,v);
		if(a[x].l==a[x].r) return;
		int mid=a[x].l+a[x].r>>1;
		if(p<=mid) px(x<<1,p,v);
		else px(x<<1|1,p,v);
	}
	int que(int x,int l,int r){
		if(a[x].l==l&&a[x].r==r) return a[x].c;
		int mid=a[x].l+a[x].r>>1;
		if(r<=mid) return que(x<<1,l,r);
		if(l>mid) return que(x<<1|1,l,r);
		return min(que(x<<1,l,mid),que(x<<1|1,mid+1,r));
	}
}T1;
struct SEG2{
	struct st{
		int l,r,c;
	}a[1048888];
	void bt(int x,int l,int r){
		a[x].l=l;
		a[x].r=r;
		a[x].c=0;
		if(l<r){
			bt(x<<1,l,(l+r>>1));
			bt(x<<1|1,(l+r>>1)+1,r);
		}
	}
	void px(int x,int p,int v){
		a[x].c=max(a[x].c,v);
		if(a[x].l==a[x].r) return;
		int mid=a[x].l+a[x].r>>1;
		if(p<=mid) px(x<<1,p,v);
		else px(x<<1|1,p,v);
	}
	int que(int x,int l,int r){
		if(a[x].l==l&&a[x].r==r) return a[x].c;
		int mid=a[x].l+a[x].r>>1;
		if(r<=mid) return que(x<<1,l,r);
		if(l>mid) return que(x<<1|1,l,r);
		return max(que(x<<1,l,mid),que(x<<1|1,mid+1,r));
	}
}T2;
int n,m,a[500005],d[500005],dfn[500005],st[22][500005],dcnt,l[500005],r[500005],k[500005],ans[500005],N,o[500005],top;
struct op{
	int l,r,k,v;
}c[1500006];
vector<int>e[500005];
void dfs(int x,int f){
	st[0][dfn[x]=++dcnt]=f;
	d[x]=d[f]+1;
	for(int i:e[x]) if(i!=f) dfs(i,x);
}
int gt(int x,int y){
	return dfn[x]<dfn[y]?x:y; 
}
int lca(int x,int y){
	x=dfn[x],y=dfn[y];
	if(x>y) swap(x,y);
	int k=__lg(y-x);
	return gt(st[k][x+1],st[k][y-(1<<k)+1]);
}
namespace IO{
	const int N=1<<20;
	char buf[N+5],*p=buf,*q=buf,qw[N+5];
	int bc;
	char getc(){
		if(p==q) p=buf,q=buf+fread(buf,1,N,stdin);
		return *p++;
	}
	void fls(){
		fwrite(qw,1,bc,stdout),bc=0;
	}
	void pc(char a){
		qw[bc++]=a;
		if(bc==N) fls();
	}
}
using IO::getc;
using IO::pc;
void rd(int&x){
	char c=getc();
	for(x=0;c>'9'||c<'0';c=getc());
	for(;c<='9'&&c>='0';c=getc()) x=x*10+(c^48);
}
void wt(int x){
	if(x>9) wt(x/10);
	pc(x%10+48);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	rd(n);
	for(int i=1,u,v;i<n;i++){
		rd(u),rd(v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	rd(m);
	dfs(1,0);
	for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++) st[i][j]=gt(st[i-1][j],st[i-1][j+(1<<(i-1))]);
	T1.bt(1,1,n-1);
	T2.bt(1,1,n);
	for(int i=1;i<=n;i++) T2.px(1,i,d[i]);
	for(int i=1;i<n;i++) a[i]=d[lca(i,i+1)],T1.px(1,i,a[i]);
	for(int i=1;i<=m;i++){
		rd(l[i]),rd(r[i]),rd(k[i]);
		r[i]--,k[i]--;
		if(k[i]) c[++N]={l[i],r[i]-k[i]+1,k[i],i},ans[i]=T1.que(1,l[i],l[i]+k[i]-1);
		else ans[i]=T2.que(1,l[i],r[i]+1);
	}
	for(int i=1;i<=n;i++){
		while(top&&a[o[top]]>a[i]){
			c[++N]={o[top-1]+1,0,i-o[top-1]-1,a[o[top]]};
			top--;
		}
		o[++top]=i;
	}
	T2.bt(1,1,n);
	sort(c+1,c+N+1,[&](op x,op y){return x.k==y.k?x.r<y.r:x.k>y.k;});
	for(int i=1;i<=N;i++){
		if(c[i].r) ans[c[i].v]=max(ans[c[i].v],T2.que(1,c[i].l,c[i].r));
		else T2.px(1,c[i].l,c[i].v);
	}
	for(int i=1;i<=m;i++) wt(ans[i]),pc('\n');
	IO::fls();
}
//yin wo zou chu zui chu yi bu
