#include<bits/stdc++.h>
#define int long long
#define ls(k) (k<<1)
#define rs(k) (k<<1|1)
using namespace std;
const int mod=1e9+7;
const int maxn=5e5+10;
int q,n;
vector<int> G[maxn];
int L[maxn],R[maxn],dep[maxn],tims,mxr[maxn];
struct node{
	int l,r,mx,mi,mx2;
}t[maxn<<2];
void pushup(int k){
	t[k].mx=max(t[ls(k)].mx,t[rs(k)].mx);
	t[k].mx2=max(t[ls(k)].mx2,t[rs(k)].mx2);
	t[k].mi=min(t[ls(k)].mi,t[rs(k)].mi);
}
void build(int k,int l,int r){
	t[k].l=l,t[k].r=r;
	if (l==r){
		t[k].mx=R[l];
		t[k].mi=L[l];
		t[k].mx2=mxr[l];
		return ;
	}
	int mid=(l+r)/2;
	build(ls(k),l,mid);
	build(rs(k),mid+1,r);
	pushup(k);
}
int query_max(int k,int x,int y){
	int l=t[k].l,r=t[k].r;
	if (x<=l&&r<=y){
		return t[k].mx;
	}
	int res=0;
	int mid=(l+r)/2;
	if (x<=mid)res=max(res,query_max(ls(k),x,y));
	if (y>mid)res=max(res,query_max(rs(k),x,y));
	return res;
}
int query_min(int k,int x,int y){
	int l=t[k].l,r=t[k].r;
	if (x<=l&&r<=y){
		return t[k].mi;
	}
	int res=1e9;
	int mid=(l+r)/2;
	if (x<=mid)res=min(res,query_min(ls(k),x,y));
	if (y>mid)res=min(res,query_min(rs(k),x,y));
	return res;
}
//pair<int,int> s[maxn];
//bool operator<(pair<int,int>,pair<)
set<pair<int,int> > sr; 
//set<int> sr[maxn];
map<int,map<int,int> > mp;
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	L[x]=++tims;
	for (auto i:G[x]){
		if (i==fa)continue;
		dfs(i,x);
	}
//	int minn=1e9;
//	for (auto i:G[x]){
//		if (i==fa)continue;
//		minn=min(minn,L[i]);
//	}
//	L[x]=minn;
	R[x]=tims;
	sr.insert(make_pair(-L[x],R[x]));
	mp[-L[x]][R[x]]=dep[x];	
//	mxr[L[x]]=max(mxr[L[x]],R[x]);
//	sr[L[x]].insert(R[x]);
}
int in[maxn],p[maxn];
bool check(int l,int r,int x,int y){
	int tmp=0,cur=0;
	for (int i=l;i<=r;i++){
		if (dep[i]>=x)tmp++;
		else tmp=0;
		cur=max(cur,tmp);
	}
	return cur>=y;
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	bool fl=0;
	for (int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
		in[u]++,in[v]++;
	}	
	int cnt=0;
	for (int i=1;i<=n;i++){
		if (in[i]==2)cnt++;
	}
	if (cnt==n-2)fl=1;
	dfs(1,0);
	build(1,1,n); 
//	cout<<fl<<'\n'; 
	if (fl){
		cin>>q;
		while (q--){
			int l,r,k;
			cin>>l>>r>>k;
			int ans=0;
			if (fl){
				int h=1,t=1;
				if (k==r-l+1){
					cout<<query_min(1,l,r)<<'\n';
					continue;
				}
				p[1]=l;
				for (int i=l+1;i<=l+k-1;i++){
					while (h<=t&&dep[i]<=dep[p[t]])t--;
					p[++t]=i;
				}
				ans=max(ans,dep[p[h]]);
				for (int i=l+k;i<=r;i++){
					while (h<=t&&i-p[h]>=k)h++;
					while (h<=t&&dep[i]<=dep[p[t]])t--;
					p[++t]=i;
					ans=max(ans,dep[p[h]]);
				}
				cout<<ans<<'\n';
				continue;
			}
		}
		return 0;
	}
	cin>>q;
	while (q--){
		int l,r,k;
		cin>>l>>r>>k;
		int mx=0,mi=0;
		int ans=0;
		for (int i=l;i+k-1<=r;i++){
//			if (L[i+k-1]>=mi&&R[i+k-1]<=mx)continue;
			mx=query_max(1,i,i+k-1);
			mi=query_min(1,i,i+k-1);
			pair<int,int> nw=*sr.lower_bound(make_pair(-mi,mx));
			auto lst=sr.lower_bound(make_pair(-mi,mx));;
			while (nw.second<mx){
				mi--;
				lst=lower_bound(++lst,sr.end(),make_pair(-mi,mx));
				nw=*lst;
			}
			ans=max(ans,mp[nw.first][nw.second]);
		}
		cout<<ans<<'\n';
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3

*/
