#include<bits/stdc++.h>
using namespace std;
#define N 500005
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ls (rt<<1)
#define rs ((rt<<1)|1)
const int INF=1e9;
const int mod=998244353;
int qpow(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;b>>=1;
}
return res;
}
int n,lg[N<<1],dep[N],po[N],dfn[N],sz[N],num,q,ans[N],eu[N],num2;
pii st[20][N<<1],sta[N*4];
int lc[20][N],top;
vector<int>g[N],era[N];
vector<pii>h[N];
struct node{
int id,l,r,K;
}a[N];
int cmp(node a,node b){return a.K<b.K;}
void dfs(int x,int fa){
dfn[x]=++num;dep[x]=dep[fa]+1;sz[x]=1;
eu[x]=++num2;st[0][num2]=mp(dep[x],x);
for(auto t:g[x]){
if(t==fa) continue;
dfs(t,x);sz[x]+=sz[t];st[0][++num2]=mp(dep[x],x);
}
}
int LCA(int x,int y){
if(x==y) return x;
int l=eu[x],r=eu[y];
if(l>r) swap(l,r);
int t=lg[r-l+1];
pii tmp=min(st[t][l],st[t][r-(1<<t)+1]);
return tmp.se;
}
int qryLCA(int l,int r){
int t=lg[r-l+1];
return LCA(lc[t][l],lc[t][r-(1<<t)+1]);
}
int mx[N<<2];
void update(int rt,int l,int r,int x,int w){
if(l==r){
mx[rt]=w;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(ls,l,mid,x,w);
else update(rs,mid+1,r,x,w);
mx[rt]=max(mx[ls],mx[rs]);
}
int query(int rt,int l,int r,int x,int y){
if(x<=l&&r<=y) return mx[rt];
int mid=(l+r)>>1,res=0;
if(x<=mid) res=max(res,query(ls,l,mid,x,y));
if(y>mid) res=max(res,query(rs,mid+1,r,x,y));
return res;
}
void build(int rt,int l,int r){
if(l==r){
if(h[l].size()) mx[rt]=h[l][0].se;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
mx[rt]=max(mx[ls],mx[rs]);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
cin>>n;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
g[x].pb(y);g[y].pb(x);
}
cin>>q;
lg[0]=-1;for(int i=1;i<(N<<1);i++) lg[i]=lg[i>>1]+1;
for(int i=1;i<=q;i++){
a[i].id=i;
cin>>a[i].l>>a[i].r>>a[i].K;
}
sort(a+1,a+q+1,cmp);
dfs(1,0);
for(int i=1;i<=19;i++)
for(int j=1;j+(1<<i)-1<=num2;j++)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
for(int i=1;i<=n;i++) lc[0][i]=i;
for(int i=1;i<=19;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
lc[i][j]=LCA(lc[i-1][j],lc[i-1][j+(1<<i-1)]);
for(int i=1;i<=n;i++){
int tmp=top,lst=0;
while(top){
int x=sta[top].se;
if(dfn[x]<=dfn[i]&&dfn[x]+sz[x]-1>=dfn[i]) break;
h[i-1].pb(mp(i-sta[top-1].fi-1,dep[sta[top].se]));
lst=sta[top].se;
top--;
}
if(tmp==top) sta[++top]=mp(i,i);
else{
int t=LCA(i-1,i);
if(t!=i) sta[++top]=mp(i-1,t);
sta[++top]=mp(i,i);
}
}
for(int i=1;i<=n;i++){
for(auto t:h[i]){
era[t.fi].pb(i);
}
}
build(1,1,n);
int now=1;
for(int i=1;i<=q;i++){
int l=a[i].l,r=a[i].r,k=a[i].K;
int tmp=max(dep[qryLCA(l,l+k-1)],dep[qryLCA(r-k+1,r)]);
while(now<k){
for(auto t:era[now]){
int nx=0;
if(po[t]!=h[t].size()-1){
po[t]++;
nx=h[t][po[t]].se;
}
update(1,1,n,t,nx);
}
now++;
}
tmp=max(tmp,query(1,1,n,l+k-1,r));
ans[a[i].id]=tmp;
}
for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
return 0;
}