#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=5e5+5;
int n,q,siz[MAXN],mson[MAXN],dep[MAXN],ans[MAXN],in[MAXN],dfn[MAXN],tot,cnt;
vector<int> edg[MAXN];
struct seg{int l,r;};
struct node{int l,r,k,id;}a[MAXN*10],b[MAXN*10];
set<seg> S[MAXN];
bool operator < (seg x,seg y){return x.l<y.l;}
struct BIT{
int a[MAXN];
void clr(int x){while(x<=n)a[x]=0,x+=(x&-x);}
void upd(int x,int v){while(x<=n)a[x]=max(a[x],v),x+=(x&-x);}
int ask(int x){int r=0;while(x){r=max(r,a[x]),x-=(x&-x);}return r;}
}T;
struct fastlca{
int mn[20][MAXN],mx[20][MAXN],st[20][MAXN],lg[MAXN];
int chk(int x,int y){return dep[x]<dep[y]?x:y;}
void build(){
	for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++){
		mn[i][j]=min(mn[i-1][j],mn[i-1][j+(1<<(i-1))]);
		mx[i][j]=max(mx[i-1][j],mx[i-1][j+(1<<(i-1))]);
		st[i][j]=chk(st[i-1][j],st[i-1][j+(1<<(i-1))]);
	}
}
int lca(int x,int y){
	if(x==y) return x;
	x=in[x],y=in[y];
	if(x>y) swap(x,y);
	int k=lg[y-(x++)];
	return chk(st[k][x],st[k][y-(1<<k)+1]);
}
int lca1(int l,int r){
	if(l==r) return l;
	int k=lg[r-l+1];
	int x=min(mn[k][l],mn[k][r-(1<<k)+1]),y=max(mx[k][l],mx[k][r-(1<<k)+1]);
	k=lg[y-(x++)];
	return chk(st[k][x],st[k][y-(1<<k)+1]);
}
}lca;
void dfs(int u,int fa){
	siz[u]=1;dep[u]=dep[fa]+1;
	in[u]=++tot;dfn[tot]=u;lca.mn[0][u]=lca.mx[0][u]=tot;lca.st[0][tot]=fa;
	for(int v:edg[u]) if(v!=fa){
		dfs(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[mson[u]]) mson[u]=v;
	} 
}
void dfs1(int u,int fa){
	if(mson[u]){
		dfs1(mson[u],u);
		swap(S[u],S[mson[u]]);
	}
	for(int v:edg[u]) if(v!=fa&&v!=mson[u]){
		dfs1(v,u);
		for(auto i:S[v]){
			auto it=S[u].upper_bound((seg){i.r+1,0});
			bool flag=false;
			if(it!=S[u].begin()){
				if((--it)->l==i.r+1) i.r=it->r,flag=true,S[u].erase(it);
			}
			it=S[u].upper_bound((seg){i.l-1,0});
			if(it!=S[u].begin()){
				if((--it)->r==i.l-1) i.l=it->l,flag=true,S[u].erase(it);
			}
			S[u].insert(i);
			if(flag){
				a[++cnt]=(node){i.l,i.r,i.r-i.l+1,dep[u]};
			}
		}
	}
	seg i=(seg){u,u};
	auto it=S[u].upper_bound((seg){i.r+1,0});
	if(it!=S[u].begin()){
		if((--it)->l==i.r+1) i.r=it->r,S[u].erase(it);
	}
	it=S[u].upper_bound((seg){i.l-1,0});
	if(it!=S[u].begin()){
		if((--it)->r==i.l-1) i.l=it->l,S[u].erase(it);
	}
	S[u].insert(i);
	a[++cnt]=(node){i.l,i.r,i.r-i.l+1,dep[u]};
}
void solve(int l,int r){
	if(l==r) return;
	int mid=(l+r)>>1;
	solve(l,mid);solve(mid+1,r);
	for(int i=mid+1,p=l-1;i<=r;i++){
		while(p<mid&&a[p+1].l>=a[i].l){
			p++;
			if(a[p].id>0) T.upd(a[p].r,a[p].id);
		}
		if(a[i].id<0) ans[-a[i].id]=max(ans[-a[i].id],T.ask(a[i].r));
	}
	for(int i=l;i<=mid;i++) if(a[i].id>0) T.clr(a[i].r);
	int m=l,p1=l,p2=mid+1;
	while(m<=r){
		if(p2==r+1||(p1<=mid&&a[p1].l>a[p2].l)) b[m++]=a[p1++];
		else b[m++]=a[p2++];
	}
	for(int i=l;i<=r;i++) a[i]=b[i];
}
int main(){
	ios::sync_with_stdio(false);
	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;
		edg[u].push_back(v);
		edg[v].push_back(u);
	}
	dfs(1,0);dfs1(1,0);lca.build();
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r,k;cin>>l>>r>>k;
		ans[i]=max(dep[lca.lca1(l,l+k-1)],dep[lca.lca1(r-k+1,r)]);
		a[++cnt]=(node){l,r,k,-i};
	}
	sort(a+1,a+cnt+1,[&](node x,node y){
		if(x.k!=y.k) return x.k>y.k;
		return x.id>y.id;
	});
	solve(1,cnt);
	for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
}
// test small data
// compile in NOI Linux2

