#include<bits/stdc++.h>
#define Yzl unsigned long long
#define fi first
#define se second
#define pi pair<int,int>
#define mp make_pair
#define pb emplace_back
#define lob lower_bound
#define upb upper_bound
typedef long long LL;

using namespace std;

const Yzl Lty=20120712;

const int MAXN=5e5+10;
int n;
vector<int> e[MAXN];
void add(int f,int t) {
	e[f].pb(t);
}
int dep[MAXN],dfn[MAXN],out[MAXN],cnt,id[MAXN];
void dfs(int u,int fa) {
	dep[u]=dep[fa]+1; dfn[u]=++cnt; id[cnt]=u;
	for(auto t:e[u]) if(t!=fa) dfs(t,u);
	out[u]=cnt;
}
namespace sub1 {
	const int N=5010;
	int a[N][N];
	void DFS(int u,int fa,int FA,int co) {
		co=min(co,dep[u]); a[FA][u]=co;
		for(auto t:e[u]) if(t!=fa) DFS(t,u,FA,co);
	}
	int hd[2],tl[2],ind[2][MAXN];
	void solve() {
		for(int i=1;i<=n;++i) DFS(i,0,i,Lty);
		int Q; scanf("%d",&Q);
		for(int i=1;i<=Q;++i) { int l,r,k; scanf("%d%d%d",&l,&r,&k);
			hd[0]=hd[1]=1; tl[0]=tl[1]=0; int res=0;
			for(int j=l;j<=r;++j) {
				while(hd[0]<=tl[0]&&dfn[j]>=dfn[ind[0][tl[0]]]) --tl[0];
				while(hd[1]<=tl[1]&&dfn[j]<=dfn[ind[1][tl[1]]]) --tl[1];
				while(hd[0]<=tl[0]&&ind[0][hd[0]]+k-1<j) ++hd[0];
				while(hd[1]<=tl[1]&&ind[1][hd[1]]+k-1<j) ++hd[1];
				ind[0][++tl[0]]=j;
				ind[1][++tl[1]]=j;
				if(j-l+1>=k) res=max(res,a[ind[0][hd[0]]][ind[1][hd[1]]]);
			} printf("%d\n",res);
		}
	}
}
namespace sub3 {
	int Fa[MAXN][20];
	struct SGT {
		int t1[MAXN<<2],t2[MAXN<<2];
		void psup(int u) {
			t1[u]=max(t1[(u<<1)],t1[(u<<1|1)]);
			t2[u]=min(t2[(u<<1)],t2[(u<<1|1)]);
		}
		void build(int u,int l,int r) {
			if(l==r) {
				t1[u]=dfn[l];
				t2[u]=dfn[l];
				return ;
			} int mid=(l+r)/2; build((u<<1),l,mid); build((u<<1|1),mid+1,r); 
//			cout<<t1[u]<<' '<<t2[u]<<endl;
			psup(u);
		}
		int query(int u,int l,int r,int x,int y,bool op) {
			if(l>=x&&r<=y) return (!op?t1[u]:t2[u]);
			int mid=(l+r)/2,res=(!op?0:Lty);
			if(x<=mid) { int ls=query((u<<1),l,mid,x,y,op);
				if(!op) res=max(res,ls);
				else res=min(res,ls);
			} if(y>mid) { int ls=query((u<<1|1),mid+1,r,x,y,op);
				if(!op) res=max(res,ls);
				else res=min(res,ls);
			} return res;
		}
	}T;
	void DFS(int u,int fa) {
		Fa[u][0]=fa;
		for(int i=1;i<=19;++i) Fa[u][i]=Fa[Fa[u][i-1]][i-1];
		for(auto t:e[u]) if(t!=fa) DFS(t,u);
	}
	int LCA(int x,int y) {
		if(dep[x]<dep[y]) swap(x,y);
		for(int i=19;i>=0;--i) if(dep[Fa[x][i]]>=dep[y]) x=Fa[x][i];
		if(x==y) return x;
		for(int i=19;i>=0;--i) if(Fa[x][i]!=Fa[y][i]) x=Fa[x][i],y=Fa[y][i];
		return Fa[x][0];
	}
	void solve() {
		int Q; scanf("%d",&Q); DFS(1,0);
		T.build(1,1,n);
		while(Q--) { int l,r,k;
			scanf("%d%d%d",&l,&r,&k);
			int lm=T.query(1,1,n,l,r,1),rm=T.query(1,1,n,l,r,0);
//			cout<<lm<<' '<<rm<<endl;
			printf("%d\n",dep[LCA(id[lm],id[rm])]);
		}
	}
}
int main () {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;++i) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); }
	dfs(1,0);
	if(n<=5000) sub1::solve();
	int mx=0;
	for(int i=1;i<=n;++i) mx=max(mx,dep[i]);
//	if(mx==n) sub2::solve();
	sub3::solve();
	return 0;
}

