#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define i128 __int128
#define ull unsigned long long
#define ui unsigned int
mt19937 rng_32(time(0));
mt19937_64 rng_64(time(0));
ull X=rng_64();
ull rng(ull x){
x^=X;
x^=x<<13;
x^=x>>7;
x^=x<<17;
x^=X;
return x;
}
const int N=5e5;
const int B=25;
int n;
vector<int> a[N+10];
int dep[N+10];
int fa[N+10][B+5];
void dfs(int u){
for(int v:a[u]){
if(v==fa[u][0]) continue;
fa[v][0]=u;
dep[v]=dep[u]+1;
dfs(v);
}
}
void init(){
for(int i=1;i<=B;i++)
for(int j=1;j<=n;j++)
fa[j][i]=fa[fa[j][i-1]][i-1];
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=B;i>=0;i--)
if(dep[u]-(1ll<<i)>=dep[v])
u=fa[u][i];
if(u==v) return u;
for(int i=B;i>=0;i--)
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
int b[N+10];
int ans[N+10];
int mx[N+10][B+5];
void init_2(){
for(int i=1;i<=n;i++) mx[i][0]=dep[i];
for(int i=1;i<=B;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
mx[j][i]=max(mx[j][i-1],mx[j+(1<<i-1)][i-1]);
}
int Max(int l,int r){
int len=__lg(r-l+1);
return max(mx[l][len],mx[r-(1<<len)+1][len]);
}
int tot;
struct node{
int l,r,k,p;
}Q[N+10];
bool cmp_l(node ave,node mujica){return ave.l>mujica.l;}
bool cmp_r(node ave,node mujica){return ave.r<mujica.r;}
bool cmp_k(node ave,node mujica){return ave.k>mujica.k;}
int cnt,st[N+10];
int tot_2;
struct node_2{
int l,r,val;
}c[N+10];
bool cmp_k_2(node_2 guy,node_2 mike){return guy.r-guy.l+1>mike.r-mike.l+1;}
set<pair<int,int> > s;
#define ls id<<1
#define rs id<<1|1
struct sgt{
int val[4*N+10];
void push_up(int id){val[id]=max(val[ls],val[rs]);}
void assign(int l,int r,int id,int p,int x){
if(l==r){
val[id]=x;
return;
}
int mid=l+r>>1;
if(p<=mid) assign(l,mid,ls,p,x);
else assign(mid+1,r,rs,p,x);
push_up(id);
}
int query(int l,int r,int id,int L,int R){
if(L<=l&&r<=R) return val[id];
int mid=l+r>>1;
if(R<=mid) return query(l,mid,ls,L,R);
if(L>mid) return query(mid+1,r,rs,L,R);
return max(query(l,mid,ls,L,R),query(mid+1,r,rs,L,R));
}
}tr;
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
a[u].push_back(v),a[v].push_back(u);
}
dep[1]=1;
dfs(1);
init();
for(int i=1;i<n;i++) b[i]=dep[lca(i,i+1)];
init_2();
int q;
cin>>q;
for(int i=1;i<=q;i++){
int l,r,k;
cin>>l>>r>>k;
if(k==1) ans[i]=Max(l,r);
else{
r--;
k--;
Q[++tot]=(node){l,r,k,i};
}
}
if(!tot){
for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
return 0;
}
n--;
sort(Q+1,Q+tot+1,cmp_r);
int pos=1;
for(int i=1;i<=n;i++){
while(cnt&&b[st[cnt]]>=b[i]){
c[++tot_2]=(node_2){st[cnt-1]+1,i-1,b[st[cnt]]};
cnt--;
}
st[++cnt]=i;
while(pos<=tot&&Q[pos].r==i){
int p_2=upper_bound(st+1,st+cnt+1,i-Q[pos].k)-st;
p_2--;
p_2++;
ans[Q[pos].p]=max(ans[Q[pos].p],b[st[p_2]]);
pos++;
}
}
sort(Q+1,Q+tot+1,cmp_l);
cnt=0;
pos=1;
for(int i=0;i<=n+2;i++) st[i]=0;
for(int i=n;i>=1;i--){
while(cnt&&b[-st[cnt]]>=b[i]) cnt--;
st[++cnt]=-i;
while(pos<=tot&&Q[pos].l==i){
int p_2=upper_bound(st+1,st+cnt+1,-(i+Q[pos].k))-st;
p_2--;
p_2++;
ans[Q[pos].p]=max(ans[Q[pos].p],b[-st[p_2]]);
pos++;
}
}
pos=0;
sort(Q+1,Q+tot+1,cmp_k);
sort(c+1,c+tot_2+1,cmp_k_2);
int pos_1=1,pos_2=1;
for(int i=n;i>=1;i--){
while(pos_1<=tot_2&&c[pos_1].r-c[pos_1].l+1>=i){
int L=c[pos_1].l,R=c[pos_1].r,val=c[pos_1].val;
tr.assign(1,n,1,L,val);
auto now=s.upper_bound(make_pair(L+1,0));
if(now!=s.begin()){
now--;
if((*now).second>=L) s.erase(now);
}
s.insert(make_pair(L,R));
pos_1++;
}
while(pos_2<=tot&&Q[pos_2].k==i){
int L=Q[pos_2].l,R=Q[pos_2].r,p=Q[pos_2].p;
auto now=s.lower_bound(make_pair(L,0));
int l_1=n+1,r_1=0;
if(now!=s.end()) l_1=(*now).first;
now=s.upper_bound(make_pair(R,0));
if(now!=s.begin()){
now--;
if((*now).second<=R) r_1=(*now).first;
else if(now!=s.begin()){
now--;
r_1=(*now).first;
}
}
if(l_1<=r_1) ans[p]=max(ans[p],tr.query(1,n,1,l_1,r_1));
pos_2++;
}
}
for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
return 0;
}