#include<bits/stdc++.h>
#define ll long long
#define fir first
#define sec second
#define pb push_back
using namespace std;
void rd(){}
template<typename T,typename ...U> void rd(T &x,U &...arg){
x=0;int f=1,c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
x*=f;rd(arg...);
}
template<typename T> void wr(T n,char end=0){
if(n==0) putchar('0');
if(n<0) putchar('-'),n=-n;
static int a[50];int p=0;
while(n!=0) a[++p]=n%10,n/=10;
while(p) putchar(a[p--]+48);
if(end) putchar(end);
}
typedef pair<int,int> pii;
const int maxn=5e5+5,inf=1e9;
struct edge{int v,prev;}E[maxn<<1];
int N,Q,head[maxn],cnt,dep[maxn],lg[maxn<<1];
void add(int u,int v){E[++cnt]={v,head[u]};head[u]=cnt;}
struct ask{int l,r,k,id;}q[maxn];
bool cmp(ask a,ask b){return a.k>b.k;}
namespace LCA{
int st[21][maxn<<1],n,dfn[maxn],arr[maxn<<1];
inline int MIN(int x,int y){return dep[x]<dep[y]?x:y;}
inline int qry(int l,int r){
int p=lg[r-l+1];
return MIN(st[p][l],st[p][r-(1<<p)+1]);
}
inline int lca(int x,int y){
x=dfn[x],y=dfn[y];
if(x>y) swap(x,y);
return qry(x,y);
}
void dfs(int u,int fa){
arr[++n]=u,dfn[u]=n,dep[u]=dep[fa]+1;
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa) dfs(v,u),arr[++n]=u;
}
void init(){
dfs(1,0);
for(int i=1;i<=n;i++) st[0][i]=arr[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[j][i]=MIN(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
}
int st[20][maxn];
inline int qry(int l,int r){
int p=lg[r-l+1];
return LCA::lca(st[p][l],st[p][r-(1<<p)+1]);
}
namespace sub1{
void solve(){
for(int i=1;i<=Q;i++){
wr(dep[qry(q[i].l,q[i].r)],'\n');
}
}
}
namespace sub2{
vector<pii> L[maxn],R[maxn];
int sz[maxn],son[maxn];
void dfs1(int u,int fa){
sz[u]=1;
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa) dfs1(v,u),sz[u]+=sz[v],son[u]=sz[son[u]]>sz[v]?son[u]:v;
}
int f[maxn],nowr[maxn];
bool vis[maxn];
int fd(int n){return f[n]==n?n:f[n]=fd(f[n]);}
void clr_vis(int u,int fa){
vis[u]=0;
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa) clr_vis(v,u);
}
inline void ins(int u,int dep){
vis[u]=1,f[u]=nowr[u]=u;
if(vis[u-1]&&vis[u+1]){
int x=fd(u-1);
f[u]=f[u+1]=x;
nowr[x]=nowr[u+1];
L[nowr[x]-x+1].pb({x,dep});
R[nowr[x]-x+1].pb({nowr[x],dep});
}else if(vis[u-1]){
int x=fd(u-1);
f[u]=x;
nowr[x]=u;
L[nowr[x]-x+1].pb({x,dep});
R[nowr[x]-x+1].pb({nowr[x],dep});
}else if(vis[u+1]){
f[u+1]=u;
nowr[u]=nowr[u+1];
L[nowr[u]-u+1].pb({u,dep});
R[nowr[u]-u+1].pb({nowr[u],dep});
}
}
void dfs3(int u,int fa,int dep){
ins(u,dep);
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa) dfs3(v,u,dep);
}
void dfs2(int u,int fa){
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa&&v!=son[u]) dfs2(v,u),clr_vis(v,u);
if(son[u]) dfs2(son[u],u);
ins(u,dep[u]);
for(int i=head[u],v=E[i].v;i;v=E[i=E[i].prev].v)
if(v!=fa&&v!=son[u]) dfs3(v,u,dep[u]);
}
#define ls i*2
#define rs i*2+1
#define mid ((l+r)>>1)
int t[maxn<<2][2];
inline void pushup(int i){t[i][0]=max(t[ls][0],t[rs][0]),t[i][1]=max(t[ls][1],t[rs][1]);}
int p,v0,v1;
void __upd(int i=1,int l=1,int r=N){
if(l==r){
t[i][0]=max(t[i][0],v0),t[i][1]=max(t[i][1],v1);
return;
}
p<=mid?__upd(ls,l,mid):__upd(rs,mid+1,r);
pushup(i);
}
void upd(int __p,int __v0,int __v1){p=__p,v0=__v0,v1=__v1;__upd();}
int LL,RR,o;
int __qry(int i=1,int l=1,int r=N){
if(l>=LL&&r<=RR) return t[i][o];
int Max=0;
if(LL<=mid) Max=max(Max,__qry(ls,l,mid));
if(RR>mid) Max=max(Max,__qry(rs,mid+1,r));
return Max;
}
int qry(int __L,int __R,int __o){LL=__L,RR=__R,o=__o;return __qry();}
#undef ls
#undef rs
#undef mid
int ans[maxn];
void solve(){
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=N;i++) L[1].pb({i,dep[i]}),R[1].pb({i,dep[i]});
sort(q+1,q+Q+1,cmp);
for(int i=N,j=1;i;i--){
for(pii k:L[i]) upd(k.fir,k.sec,0);
for(pii k:R[i]) upd(k.fir,0,k.sec);
while(j<=Q&&q[j].k>=i){
ans[q[j].id]=max(dep[::qry(q[j].l,q[j].r)],
max(qry(q[j].l,q[j].r-q[j].k+1,0),qry(q[j].l+q[j].k-1,q[j].r,1)));
j++;
}
}
for(int i=1;i<=Q;i++) wr(ans[i],'\n');
}
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
rd(N);
for(int i=1;i<N;i++){
int u,v;rd(u,v);
add(u,v),add(v,u);
}
rd(Q);
bool flag=1;
for(int i=1;i<=Q;i++) rd(q[i].l,q[i].r,q[i].k),q[i].id=i,flag&=q[i].k==q[i].r-q[i].l+1;
for(int i=2;i<(maxn<<1);i++) lg[i]=lg[i>>1]+1;
LCA::init();
for(int i=1;i<=N;i++) st[0][i]=i;
for(int j=1;(1<<j)<=N;j++)
for(int i=1;i+(1<<j)-1<=N;i++)
st[j][i]=LCA::lca(st[j-1][i],st[j-1][i+(1<<(j-1))]);
if(flag) sub1::solve();
else sub2::solve();
return 0;
}