#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define eb emplace_back
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
int read() {
int x=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
return x*w;
}
const int N=1e6+5;
int n,q,l[N],r[N],ans[N],x[N],y[N],son[N],sz[N],rt[N],dfn[N],tick,top[N],d[N],id[N],tot,fa[N][22],de[N],nd[N],ft[N];
vi e[N],pk[N],sk[N];
vector<pair<pii,int>> itv;
int mn[22][N],mx[22][N];
void pref() {
rep(i,1,n) mn[0][i]=mx[0][i]=dfn[i];
rep(h,1,20) rep(i,1,n) if(i+(1<<h)-1<=n)
mn[h][i]=min(mn[h-1][i],mn[h-1][i+(1<<h-1)]),
mx[h][i]=max(mx[h-1][i],mx[h-1][i+(1<<h-1)]);
}
int lca(int x,int y) {
for(;top[x]!=top[y];x=ft[top[x]])
if(d[top[x]]<d[top[y]]) swap(x,y);
return d[x]<d[y]?x:y;
}
int qry(int l,int r) {
int h=__lg(r-l+1);
int dl=min(mn[h][l],mn[h][r-(1<<h)+1]);
int dr=max(mx[h][l],mx[h][r-(1<<h)+1]);
return lca(id[dl],id[dr]);
}
void dfs(int u,int fa){
++tick; d[u]=d[fa]+1; ft[u]=fa;
dfn[u]=tick; id[tick]=u;
for(int v:e[u]) if(v!=fa) {
dfs(v,u);
if(sz[v]>sz[son[u]]) son[u]=v;
sz[u]+=sz[v];
}
sz[u]++;
}
void dfs2(int u,int tp) {
top[u]=tp;
for(int v:e[u]) if(v!=ft[u]) {
if(v==son[u]) dfs2(v,tp);
else dfs2(v,v);
}
}
int work(int l,int r,int ff) {
int u=qry(l,r); ++tot; x[tot]=l, y[tot]=r; int w=tot;
fa[w][0]=ff; nd[w]=u;
rep(h,1,20) fa[w][h]=fa[fa[w][h-1]][h-1];
sk[r-l+1].eb(w);
if(l==r) {de[l]=w; return w;}
for(;;) {
if(l>r) break;
int L=l+1,R=r,x=l;
while(L<=R) {
int m=(L+R)>>1;
if(qry(l,m)!=u) x=m,L=m+1;
else R=m-1;
}
int v=work(l,x,w);
l=x+1;
} return w;
}
int QQ(int l,int r,int k) {
int u=de[l],v=de[r],resl=0,resr=0;
per(h,20,0) {
int pu=fa[u][h];
if(pu&&y[pu]-l+1<k) u=pu;
} u=fa[u][0];
resl=d[nd[u]];
per(h,20,0) {
int pv=fa[v][h];
if(pv&&r-x[pv]+1<k) v=pv;
} v=fa[v][0];
resr=d[nd[v]];
return max(resl,resr);
}
#define ls (p<<1)
#define rs (p<<1)+1
int fw[N*4];
void build(int p,int l,int r) {
fw[p]=-1; int mid=l+r>>1; if(l==r) return;
build(ls,l,mid), build(rs,mid+1,r);
}
void upd(int p,int l,int r,int x,int y) {
fw[p]=max(fw[p],y); int mid=l+r>>1; if(l==r) return;
if(x<=mid) upd(ls,l,mid,x,y); else upd(rs,mid+1,r,x,y);
}
int qry(int p,int l,int r,int x,int y){
if(l==x&&r==y) return fw[p]; int mid=l+r>>1;
if(y<=mid) return qry(ls,l,mid,x,y);
else if(x>mid) return qry(rs,mid+1,r,x,y);
else return max(qry(ls,l,mid,x,mid),qry(rs,mid+1,r,mid+1,y));
}
signed main() {
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
rep(i,2,n) {
int u=read(),v=read();
e[u].eb(v), e[v].eb(u);
}
dfs(1,0);
dfs2(1,1);
pref();
work(1,n,0);
int q=read();
rep(i,1,q) {
l[i]=read(), r[i]=read();
int k=read();
ans[i]=QQ(l[i],r[i],k);
pk[k].eb(i);
}
build(1,1,n);
per(k,n,1) {
for(int w:sk[k]) {
upd(1,1,n,x[w],d[nd[w]]);
}
for(int i:pk[k]) {
int res=qry(1,1,n,l[i],r[i]-k+1);
ans[i]=max(ans[i],res);
}
}
rep(i,1,q) printf("%lld\n",ans[i]);
return 0;
}