#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
struct node{
	int lm, rm, ans, al;
} t[N*8];
int n;
namespace SGT{

	node merge(const node a, const node b) {
		node c;
		c.al=a.al&&b.al;
		
		if(a.al) c.lm=a.lm+b.lm;
		else c.lm=a.lm;
		if(b.al) c.rm=b.rm+a.rm;
		else c.rm=b.rm;
		
		c.ans=max({a.ans, b.ans, a.rm+b.lm});
//		cout<<a.lm<<a.rm<<" "<<b.lm<<b.rm<<"??";
		return c;
	}
	void build(int u=1, int l=1, int r=n) {
		if(l==r) {
			return t[u]=node{1, 1, 1, 1}, void();
		}
		int mid=l+r>>1;
		build(u<<1, l, mid);
		build(u<<1|1, mid+1, r);
		t[u]=merge(t[u<<1], t[u<<1|1]);
	}
	void insert(int x, int v, int u=1, int l=1, int r=n) {
		if(l==r) {
//			cout<<u<<" "<<l<<" "<<r<<"\n";
			return t[u]=node{v, v, v, v}, void();
		}
		int mid=l+r>>1;
//		cout<<x<<" "<<mid<<" ";
//		cout<<u<<" "<<t[u<<1].lm<<" "<<t[u<<1|1].rm<<"?";
		if(x<=mid) insert(x, v, u<<1, l, mid);
		if(x>mid) insert(x, v, u<<1|1, mid+1, r);
		t[u]=merge(t[u<<1], t[u<<1|1]);
	}
	node query(int L, int R, int u=1, int l=1, int r=n) {
		
		if(L<=l&&r<=R) {
//			cout<<t[u].lm<<" "<<t[u].rm<<" "<<t[u].ans<<endl;
			return t[u];
		}
		int mid=l+r>>1;
		if(R<=mid) return query(L, R, u<<1, l, mid);
		if(L>mid) return query(L, R, u<<1|1, mid+1, r);
		return merge(query(L, R, u<<1, l, mid), query(L, R, u<<1|1, mid+1, r)); 
	}
}
using namespace SGT;
int a[N];
int dep[N], up[N][20], ans[5005][5005], de[N], rdep[N];
vector<int> e[N];
void dfs(int u, int fa) {
	dep[u]=dep[fa]+1;
	up[u][0]=fa;
	for(int i=1; i<=19; i++)
		up[u][i]=up[up[u][i-1]][i-1];
	for(int v:e[u]) {
		if(v==fa) continue ;
		dfs(v, u);
	}
}
int lca(int x, int y) {
	if(dep[x]<dep[y]) swap(x, y);
	for(int i=19; ~i; i--) 
		if(dep[up[x][i]]>=dep[y]) x=up[x][i];
	if(x==y) return x;
	for(int i=19; ~i; i--)
		if(up[x][i]!=up[y][i]) x=up[x][i], y=up[y][i];
	return up[x][0];
}
int q;
struct QRY{
	int id, l, r, k;
} qr[N], tmp[N], q1[N], q2[N];
int Ans[N], vis[N];
void solve(int l, int r, int L, int R) {
	if(L>R) return ;
	
	if(l==r) {
		for(int i=L; i<=R; i++) {
//			if(qr[i].id==1) cout<<"SB";
			Ans[qr[i].id]=l;
		}
		return ;
	}
	int mid=l+r>>1;
	for(int i=l; i<=mid; i++) {
		insert(rdep[i], 0);
	}
	int t1=0, t2=0;
	for(int i=L; i<=R; i++) {
		node res=query(qr[i].l, qr[i].r);
//		cout<<res.ans<<" "<<qr[i].k<<endl;
		if(res.ans>=qr[i].k) {
			q2[++t2]=qr[i];
		} else {
			q1[++t1]=qr[i];
		}
	}
	int tl=L-1;
	for(int i=1; i<=t1; i++)
		qr[++tl]=q1[i];
	for(int i=1; i<=t2; i++)
		qr[++tl]=q2[i];
//	if(tl!=R) cout<<"SB";
	
	solve(mid+1, r, L+t1, R);
	for(int i=l; i<=mid; i++) {
		insert(rdep[i], 1);
	}
	solve(l, mid, L, L+t1-1);
}
int main() {
	freopen("query.in", "r", stdin);
	freopen("query.out","w",stdout); 
	cin.tie(0)->sync_with_stdio(false);
	cin>>n;
	for(int i=1; i<n; i++) {
		int u, v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
		de[u]++; de[v]++;
	}
	int _1=0, fl=1;
	for(int i=2; i<=n; i++) {
		if(de[i]>2) {
			fl=0;
			break ;
		} 
		if(de[i]==1) _1++;
	}
	if(fl&&_1==1) {
		//chain 
		dfs(1, 0);
		for(int i=1; i<=n; i++) {
			rdep[dep[i]]=i;
		}
		cin>>q;
		for(int i=1; i<=q; i++) {
			int l, r, k;
			cin>>l>>r>>k;
			qr[i]={i, l, r, k};
		}
		build();
//		cout<<"???";
/*		for(int i=1; i<=446; i++) {
			
			insert(rdep[i], 0);
		}*/
//			cout<<qr[1].l<<" "<<qr[1].r<<" ";
//		cout<<query(qr[1].l, qr[1].r).ans<<" "<<qr[1].k<<endl;
//		return 0;//
		
		solve(1, n, 1, q);
//		for(int i=1; i<=n; i++)
//			cout<<query(i, i).ans<<" ";
		for(int i=1; i<=q; i++)
			cout<<Ans[i]<<"\n";
		return 0;
	} else {
		dfs(1, 0);
		for(int l=1; l<=n; l++) {
			int x=l;
			ans[l][l]=dep[x];
			for(int r=l+1; r<=n; r++) {
				if(x!=1) x=lca(x, r);
				ans[l][r]=dep[x];
			}
		}
		cin>>q;
		for(int i=1; i<=q; i++) {
			int l, r, k;
			cin>>l>>r>>k;
			int res=0;
			for(int _l=l, _r=l+k-1; _r<=r; _l++, _r++) {
				res=max(res, ans[_l][_r]);
			}
			printf("%d\n", res);
		}
	}

	return 0;
}

