#include<bits/stdc++.h>
using namespace std;
const int N=5005,M=5e5+5;
int n,q,lc[N][N],isfa[N][N],st1[25][M],st2[25][M],fa[M][25],d[M],rk[M],dfn[M],cnt=0,rt[M],ls[M<<5],rs[M<<5],tot=0,head[M],ecnt=0;
struct edge {int to,nxt;}e[M<<1];
void addedge(int u,int v) {e[++ecnt]=(edge){v,head[u]};head[u]=ecnt;}
struct node {
	int val,llen,rlen,len;
	node operator+(const node &o) const {
		node x;
		if(llen==len) x.llen=llen+o.llen;
		else x.llen=llen;
		if(o.rlen==o.len) x.rlen=o.rlen+rlen;
		else x.rlen=o.rlen;
		x.len=len+o.len;
		x.val=max({val,o.val,rlen+o.llen});
		return x;
	}
}val[M<<5];
void dfs(int u,int pre,int dep) {
	rk[++cnt]=u,dfn[u]=cnt,fa[u][0]=pre,d[u]=dep;
	for(int i=1; i<=20; i++) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=head[u]; i; i=e[i].nxt) {
		int v=e[i].to;
		if(v==pre) continue;
		dfs(v,u,dep+1);
	}
}
int lca(int u,int v) {
	if(d[u]<d[v]) swap(u,v);
	for(int i=20; i>=0; i--) if(d[fa[u][i]]>=d[v]) u=fa[u][i];
	if(u==v) return u;
	for(int i=20; i>=0; i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
int build(int l,int r) {
	int cur=++tot;
	if(l==r) {
		val[cur]={1,1,1,1};
		return cur;
	}
	int mid=l+r>>1;
	ls[cur]=build(l,mid);
	rs[cur]=build(mid+1,r);
	val[cur]=val[ls[cur]]+val[rs[cur]];
	return cur;
}
int add(int lst,int l,int r,int x) {
	int cur=++tot;
	ls[cur]=ls[lst],rs[cur]=rs[lst],val[cur]=val[lst];
	if(l==r) {
		val[cur]={0,0,0,1};
		return cur;
	}
	int mid=l+r>>1;
	if(x<=mid) ls[cur]=add(ls[lst],l,mid,x);
	else rs[cur]=add(rs[lst],mid+1,r,x);
	val[cur]=val[ls[cur]]+val[rs[cur]];
	return cur;
}
node query(int cur,int l,int r,int L,int R) {
	if(l>=L&&r<=R) return val[cur];
	int mid=l+r>>1;
	if(R<=mid) return query(ls[cur],l,mid,L,R);
	else if(L>mid) return query(rs[cur],mid+1,r,L,R);
	else return query(ls[cur],l,mid,L,R)+query(rs[cur],mid+1,r,L,R);
}
int mn(int l,int r) {
	int tmp=log2(r-l+1);
	return min(st1[tmp][l],st1[tmp][r-(1<<tmp)+1]);
}
int mx(int l,int r) {
	int tmp=log2(r-l+1);
	return max(st2[tmp][l],st2[tmp][r-(1<<tmp)+1]);
}
bool check() {
	for(int i=1; i<=n; i++) if(dfn[i]!=d[i]) return false;
	return true;
}
int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;
	for(int i=1; i<n; i++) {
		int u,v;
		cin>>u>>v;
		addedge(u,v),addedge(v,u);
	}
	dfs(1,0,1);
	cin>>q;
	if(n<=5000&&q<=5000) {
		for(int i=1; i<=n; i++) {
			int cur=i;
			while(cur) {
				isfa[i][cur]=true;
				cur=fa[cur][0];
			}
		}
		for(int i=1; i<=n; i++) {
			int cur=i;
			for(int j=i; j<=n; j++) {
				while(!isfa[j][cur]) cur=fa[cur][0];
				lc[i][j]=cur;
			}
		}
		while(q--) {
			int l,r,k;
			cin>>l>>r>>k;
			int ans=0;
			for(int i=l; i<=r-k+1; i++) ans=max(ans,d[lc[i][i+k-1]]);
			cout<<ans<<'\n';
		}
	} else if(check()) {
		rt[1]=build(1,n);
		for(int i=2; i<=n; i++) rt[i]=add(rt[i-1],1,n,rk[i-1]);
		while(q--) {
			int l,r,k;
			cin>>l>>r>>k;
			int L=1,R=n,ans;
			while(L<=R) {
				int mid=L+R>>1;
				if(query(rt[mid],1,n,l,r).val>=k) ans=mid,L=mid+1;
				else R=mid-1;
			}
			cout<<ans<<'\n';
		}
	} else {
		for(int i=1; i<=n; i++) st1[0][i]=st2[0][i]=dfn[i];
		for(int i=1; (1<<i)<=n; i++) {
			for(int j=1; j+(1<<i)-1<=n; j++) {
				st1[i][j]=min(st1[i-1][j],st1[i-1][j+(1<<i-1)]);
				st2[i][j]=max(st2[i-1][j],st2[i-1][j+(1<<i-1)]);
			}
		}
		while(q--) {
			int l,r,k;
			cin>>l>>r>>k;
			cout<<d[lca(rk[mn(l,r)],rk[mx(l,r)])]<<'\n';
		}
	}
	return 0;
}
