#include <bits/stdc++.h>
using namespace std;
int Qread()
{
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return x;
}
vector<int> ed[500010];
void add_edge(int u,int v)
{
ed[u].push_back(v);
ed[v].push_back(u);
}
int Log[500010];
int n,q;
int dep[500010],ind[500010],dfn;
namespace LCA{
pair<int,int> st[20][500010];
void init()
{
for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
int qry(int l,int r)
{
int t=Log[r-l+1];
return min(st[t][l],st[t][r-(1<<t)+1]).second;
}
int lca(int u,int v)
{
if(u==v) return u;
if(ind[u]<ind[v]) return qry(ind[u]+1,ind[v]);
return qry(ind[v]+1,ind[u]);
}
};
namespace mxDep{
int st[20][500010];
void init()
{
for(int i=1;i<20;i++) for(int j=1;j+(1<<i)-1<=n;j++)
st[i][j]=max(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
int qry(int l,int r)
{
int t=Log[r-l+1];
return max(st[t][l],st[t][r-(1<<t)+1]);
}
}
void dfs(int a,int fa)
{
dep[a]=dep[fa]+1;
ind[a]=++dfn;
LCA::st[0][dfn]=make_pair(dep[a],fa);
mxDep::st[0][a]=dep[a];
for(int v:ed[a]) if(v!=fa) dfs(v,a);
}
namespace DSU{
int fa[500010],siz[500010],L[500010],R[500010];
void init(int n)
{
for(int i=1;i<=n;i++)
fa[i]=L[i]=R[i]=i,siz[i]=1;
}
int get_fa(int a){return a==fa[a]?a:fa[a]=get_fa(fa[a]);}
void merge(int u,int v)
{
u=get_fa(u),v=get_fa(v);
if(siz[u]>siz[v]) fa[v]=u,siz[u]+=siz[v],R[u]=R[v];
else fa[u]=v,siz[v]+=siz[u],L[v]=L[u];
}
}
vector<int> op[500010];
struct Op{int l,r,k,id;};
bool cmp1(Op x,Op y){return x.k!=y.k?x.k>y.k:x.id<y.id;}
bool cmp2(Op x,Op y){return x.r!=y.r?x.r>y.r:x.id<y.id;}
int ans[500010];
Op P[1000010],P_[1000010];
namespace BIT{
int num[1000010];
void add(int x,int k){for(;x<=n;x+=(x&-x)) num[x]=max(num[x],k);}
int qry(int x){int ret=0;for(;x;x-=(x&-x)) ret=max(ret,num[x]);return ret;}
void del(int x){for(;x<=n;x+=(x&-x)) num[x]=0;}
}
void solve(int L,int R)
{
if(L==R) return;
int mid=(L+R>>1),top=0;
for(int i=L;i<=mid;i++) if(P[i].id<0) P_[++top]=P[i];
for(int i=mid+1;i<=R;i++) if(P[i].id>0) P_[++top]=P[i];
sort(P_+1,P_+top+1,cmp2);
for(int i=1;i<=top;i++)
if(P_[i].id<0) BIT::add(P_[i].l,-P_[i].id);
else ans[P_[i].id]=max(ans[P_[i].id],BIT::qry(P_[i].l));
for(int i=1;i<=top;i++)
if(P_[i].id<0) BIT::del(P_[i].l);
solve(L,mid),solve(mid+1,R);
}
int tot;
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
for(int i=2;i<=500000;i++) Log[i]=Log[i>>1]+1;
n=Qread();
for(int i=1;i<n;i++) add_edge(Qread(),Qread());
dfs(1,0);
LCA::init(),mxDep::init();
DSU::init(n);
for(int i=1;i<n;i++)
op[dep[LCA::lca(i,i+1)]].push_back(i);
for(int i=n,tk;i;i--) for(int g:op[i])
{
DSU::merge(g,g+1);
tk=DSU::get_fa(g);
P[++tot]=Op{DSU::L[tk],DSU::R[tk],DSU::R[tk]-DSU::L[tk]+1,-i};
}
q=Qread();
for(int i=1,l,r,k;i<=q;i++)
{
l=Qread(),r=Qread(),k=Qread();
if(k==1) ans[i]=mxDep::qry(l,r);
else P[++tot]=Op{r-k+1,l+k-1,k,i};
}
sort(P+1,P+tot+1,cmp1);
solve(1,tot);
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
return 0;
}