#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n,q,hd[500001],to[1000001],nxt[1000001],idx,dep[500001],fat[500001][21];
struct node {
	int l,r,k;
}a[500001];
inline void add(int u,int v) {
	to[++idx]=v;
	nxt[idx]=hd[u];
	hd[u]=idx;
}
void dfs(int u,int fa) {
	dep[u]=dep[fa]+1;
	fat[u][0]=fa;
	for(int i=1;i<=20;++i) fat[u][i]=fat[fat[u][i-1]][i-1];
	for(int i=hd[u];i;i=nxt[i]) {
		int v=to[i];
		if(v==fa) continue;
		dfs(v,u); 
	}
}
int lca(int u,int v) {
	if(dep[u]<dep[v]) swap(u,v);
	int d=dep[u]-dep[v];
	for(int i=0;i<=20;++i)
		if(d>>i&1) u=fat[u][i];
	if(u==v) return u;
	for(int i=20;i>=0;--i) {
		if(fat[u][i]==fat[v][i]) continue;
		u=fat[u][i];
		v=fat[v][i];
	}
	return fat[u][0];
}
namespace sol1 {
	int lg[500001],f[500001][21];
	inline int ask(int l,int r) {
		int t=lg[r-l+1];
		return lca(f[l][t],f[r-(1<<t)+1][t]);
	}
	void work() {
		for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
		for(int i=1;i<=n;++i) f[i][0]=i;
		for(int j=1;j<=lg[n];++j)
			for(int i=1;i+(1<<j)-1<=n;++i) f[i][j]=lca(f[i][j-1],f[i+(1<<j-1)][j-1]);	
		int l,r,k;
		for(int i=1;i<=q;++i) {
			l=a[i].l;
			r=a[i].r;
			k=a[i].k;
			int ans=0;
			for(int i=l+k-1;i<=r;++i) ans=max(ans,dep[ask(i-k+1,i)]);
			printf("%d\n",ans);
		}
	}
}
namespace sol2 {
	int lg[500001],f[500001][21],tr[2000001],ans[500001];
	vector<int>vec[500001];
	vector<pair<int,int>>st[500010];
	inline int ask(int l,int r) {
		int t=lg[r-l+1];
		return min(f[l][t],f[r-(1<<t)+1][t]);
	}
	void upd(int rt,int l,int r,int x,int y) {
		if(l==r) {
			tr[rt]=y;
			return;
		}
		int mid=l+r>>1;
		if(x<=mid) upd(rt<<1,l,mid,x,y);
		else upd(rt<<1|1,mid+1,r,x,y);
		tr[rt]=max(tr[rt<<1],tr[rt<<1|1]);
	}
	int ask(int rt,int l,int r,int L,int R) {
		if(L<=l&&r<=R) return tr[rt];
		int mid=l+r>>1,res=0;
		if(L<=mid) res=max(res,ask(rt<<1,l,mid,L,R));
		if(R>mid) res=max(res,ask(rt<<1|1,mid+1,r,L,R));
		return res;
	}
	void work() {
		for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
		for(int i=1;i<=n;++i) f[i][0]=dep[i];
		for(int j=1;j<=lg[n];++j)
			for(int i=1;i+(1<<j)-1<=n;++i) f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);	
		for(int i=1;i<=n;++i) {
			st[1].push_back({i,dep[i]});
			int p=i;
			while(ask(p,n)!=dep[p]) {
				int l=p,r=n,w;
				while(l<=r) {
					int mid=l+r>>1;
					if(ask(p,mid)==dep[p]) {
						w=mid;
						l=mid+1;
					}
					else r=mid-1;
				}
				p=w+1;
				st[p-i+1].push_back({i,dep[p]});
			}
		}
		for(int i=1;i<=q;++i) vec[a[i].k].push_back(i);
		for(int i=1;i<=n;++i) {
			for(pair<int,int>p:st[i]) upd(1,1,n,p.first,p.second);
			for(int x:vec[i]) ans[x]=ask(1,1,n,a[x].l,a[x].r-i+1);
		}
		for(int i=1;i<=q;++i) printf("%d\n",ans[i]);
	}
}
int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,u,v;i<n;++i) {
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	scanf("%d",&q);
	bool flag=true;
	int l,r,k;
	for(int i=1;i<=q;++i) {
		scanf("%d%d%d",&l,&r,&k);
		a[i]={l,r,k};
		flag&=(k==r-l+1);
	}
	if(n<=5000&&q<=5000||flag) sol1::work();
	else sol2::work();
	return 0;
}
