#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define pi pair<int,int>
void in(int &x){
x=0;int f=1;char c=getchar();
while((c>'9'||c<'0')&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
x*=f;
}
int t,n,m,k,x,y,z,res[500005];
vector<int>g[500005];
int ff[500005],dep[500005];
int idx,dfn[500005],lg[500005],fx[20][500005];
int mn[20][500005],mx[20][500005],pos[500005];
void dfs(int k,int fa){
dep[k]=dep[fa]+1;ff[k]=fa;
dfn[k]=++idx;fx[0][idx]=k;
mn[0][k]=mx[0][k]=idx;pos[idx]=k;
for(int v:g[k]){
if(v==fa)continue;
dfs(v,k);
}
}
int get(int x,int y){return dep[x]<dep[y]?x:y;}
void init(){
lg[1]=0;for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
for(int i=1;i<=lg[n];i++)for(int j=1;j+(1<<i)-1<=n;j++){
fx[i][j]=get(fx[i-1][j],fx[i-1][j+(1<<i-1)]);
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)]);
}
}
int query(int l,int r){
int k=lg[r-l+1];
return get(fx[k][l],fx[k][r-(1<<k)+1]);
}
int qmin(int l,int r){
int k=lg[r-l+1];
return min(mn[k][l],mn[k][r-(1<<k)+1]);
}
int qmax(int l,int r){
int k=lg[r-l+1];
return max(mx[k][l],mx[k][r-(1<<k)+1]);
}
int lca(int x,int y){
if(x==y)return x;
if(dfn[x]>dfn[y])swap(x,y);
x=dfn[x]+1;y=dfn[y];
return ff[query(x,y)];
}
int val[2000005],lf[500005];
void build(int l,int r,int id){
if(l==r){lf[l]=id;return;}
int mid=(l+r)/2;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
}
void upd(int x,int k){
int u=lf[x];
while(u){
if(k>val[u])val[u]=k;
else break;
u>>=1;
}
}
int query(int l,int r,int id,int ql,int qr){
if(ql<=l&&r<=qr)return val[id];
int mid=(l+r)/2,ans=0;
if(ql<=mid)ans=max(ans,query(l,mid,id<<1,ql,qr));
if(mid+1<=qr)ans=max(ans,query(mid+1,r,id<<1|1,ql,qr));
return ans;
}
struct Q{int l,r,id;};
vector<Q>ql[500005],qr[500005];
vector<pi>pl[500005],pr[500005];
int a[500005],b[500005],d[500005];
void solve(int l,int r){
if(l==r){
pl[1].pb({l,dep[l]});
return;
}
int mid=(l+r)/2;
solve(l,mid);solve(mid+1,r);
a[mid]=mid;
for(int i=mid-1;i>=l;i--)a[i]=lca(i,a[i+1]);
b[mid+1]=mid+1;
for(int i=mid+2;i<=r;i++)b[i]=lca(i,b[i-1]);
for(int i=mid+1;i<=r;i++)d[i]=0;
for(int i=mid;i>=l;i--){
int x=lca(mid+1,a[i]);
int L=mid+1,R=r;
while(L<R){
int M=(L+R+1)/2;
if(dep[b[M]]>=dep[x])L=M;
else R=M-1;
}
pl[L-i+1].pb({i,dep[x]});
if(L<=r)d[L+1]=i;
}
int x=0;
for(int i=mid+1;i<=r;i++){
if(d[i])x=d[i];
if(x){
pr[i-x+1].pb({i,dep[b[i]]});
}
}
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
in(n);
for(int i=1;i<n;i++){
in(x);in(y);
g[x].pb(y);g[y].pb(x);
}
dfs(1,0);init();
in(m);
for(int i=1;i<=m;i++){
in(x);in(y);in(z);
if(z==y-x+1){
int u=pos[qmin(x,y)];
int v=pos[qmax(x,y)];
res[i]=dep[lca(u,v)];
continue;
}
ql[z].pb({x,y-z+1,i});
qr[z].pb({x+z-1,y,i});
}
solve(1,n);
build(1,n,1);
for(int i=n;i>=1;i--){
for(pi z:pl[i])upd(z.first,z.second);
for(Q z:ql[i])res[z.id]=max(res[z.id],query(1,n,1,z.l,z.r));
}
for(int i=0;i<=4*n;i++)val[i]=0;
for(int i=n;i>=1;i--){
for(pi z:pr[i])upd(z.first,z.second);
for(Q z:qr[i])res[z.id]=max(res[z.id],query(1,n,1,z.l,z.r));
}
for(int i=1;i<=m;i++)printf("%d\n",res[i]);
}