#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=5e5+5;
int n,q,siz[MAXN],mson[MAXN],dep[MAXN],ans[MAXN],in[MAXN],dfn[MAXN],tot,cnt;
vector<int> edg[MAXN];
struct seg{int l,r;};
struct node{int l,r,k,id;}a[MAXN*10],b[MAXN*10];
set<seg> S[MAXN];
bool operator < (seg x,seg y){return x.l<y.l;}
struct BIT{
int a[MAXN];
void clr(int x){while(x<=n)a[x]=0,x+=(x&-x);}
void upd(int x,int v){while(x<=n)a[x]=max(a[x],v),x+=(x&-x);}
int ask(int x){int r=0;while(x){r=max(r,a[x]),x-=(x&-x);}return r;}
}T;
struct fastlca{
int mn[20][MAXN],mx[20][MAXN],st[20][MAXN],lg[MAXN];
int chk(int x,int y){return dep[x]<dep[y]?x:y;}
void build(){
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++){
mn[i][j]=min(mn[i-1][j],mn[i-1][j+(1<<(i-1))]);
mx[i][j]=max(mx[i-1][j],mx[i-1][j+(1<<(i-1))]);
st[i][j]=chk(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
}
int lca(int x,int y){
if(x==y) return x;
x=in[x],y=in[y];
if(x>y) swap(x,y);
int k=lg[y-(x++)];
return chk(st[k][x],st[k][y-(1<<k)+1]);
}
int lca1(int l,int r){
if(l==r) return l;
int k=lg[r-l+1];
int x=min(mn[k][l],mn[k][r-(1<<k)+1]),y=max(mx[k][l],mx[k][r-(1<<k)+1]);
k=lg[y-(x++)];
return chk(st[k][x],st[k][y-(1<<k)+1]);
}
}lca;
void dfs(int u,int fa){
siz[u]=1;dep[u]=dep[fa]+1;
in[u]=++tot;dfn[tot]=u;lca.mn[0][u]=lca.mx[0][u]=tot;lca.st[0][tot]=fa;
for(int v:edg[u]) if(v!=fa){
dfs(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[mson[u]]) mson[u]=v;
}
}
void dfs1(int u,int fa){
if(mson[u]){
dfs1(mson[u],u);
swap(S[u],S[mson[u]]);
}
for(int v:edg[u]) if(v!=fa&&v!=mson[u]){
dfs1(v,u);
for(auto i:S[v]){
auto it=S[u].upper_bound((seg){i.r+1,0});
bool flag=false;
if(it!=S[u].begin()){
if((--it)->l==i.r+1) i.r=it->r,flag=true,S[u].erase(it);
}
it=S[u].upper_bound((seg){i.l-1,0});
if(it!=S[u].begin()){
if((--it)->r==i.l-1) i.l=it->l,flag=true,S[u].erase(it);
}
S[u].insert(i);
if(flag){
a[++cnt]=(node){i.l,i.r,i.r-i.l+1,dep[u]};
}
}
}
seg i=(seg){u,u};
auto it=S[u].upper_bound((seg){i.r+1,0});
if(it!=S[u].begin()){
if((--it)->l==i.r+1) i.r=it->r,S[u].erase(it);
}
it=S[u].upper_bound((seg){i.l-1,0});
if(it!=S[u].begin()){
if((--it)->r==i.l-1) i.l=it->l,S[u].erase(it);
}
S[u].insert(i);
a[++cnt]=(node){i.l,i.r,i.r-i.l+1,dep[u]};
}
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
for(int i=mid+1,p=l-1;i<=r;i++){
while(p<mid&&a[p+1].l>=a[i].l){
p++;
if(a[p].id>0) T.upd(a[p].r,a[p].id);
}
if(a[i].id<0) ans[-a[i].id]=max(ans[-a[i].id],T.ask(a[i].r));
}
for(int i=l;i<=mid;i++) if(a[i].id>0) T.clr(a[i].r);
int m=l,p1=l,p2=mid+1;
while(m<=r){
if(p2==r+1||(p1<=mid&&a[p1].l>a[p2].l)) b[m++]=a[p1++];
else b[m++]=a[p2++];
}
for(int i=l;i<=r;i++) a[i]=b[i];
}
int main(){
ios::sync_with_stdio(false);
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
cin>>n;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
edg[u].push_back(v);
edg[v].push_back(u);
}
dfs(1,0);dfs1(1,0);lca.build();
cin>>q;
for(int i=1;i<=q;i++){
int l,r,k;cin>>l>>r>>k;
ans[i]=max(dep[lca.lca1(l,l+k-1)],dep[lca.lca1(r-k+1,r)]);
a[++cnt]=(node){l,r,k,-i};
}
sort(a+1,a+cnt+1,[&](node x,node y){
if(x.k!=y.k) return x.k>y.k;
return x.id>y.id;
});
solve(1,cnt);
for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
}