#include<bits/stdc++.h>
using namespace std;
mt19937 rnd(time(0));
int a,b,ans[500001],q,w,e,de[500001],cnt,dfn[500001],lg[1000001],st[21][1000001];
vector<int> qu[500001];
int Min(int qq,int ww){return de[qq]<de[ww]?qq:ww;}
int get(int qq,int ww)
{
int lgg=lg[ww-qq+1];
return de[Min(st[lgg][qq],st[lgg][ww-(1<<lgg)+1])];
}
void dfs(int qq,int ww)
{
dfn[qq]=++cnt;
st[0][cnt]=qq;
de[qq]=de[ww]+1;
for(int i=0;i<qu[qq].size();i++)
{
int tt=qu[qq][i];
if(tt==ww) continue;
dfs(tt,qq);
++cnt;st[0][cnt]=qq;
}
}
vector<int> ve[1000001];
int vii[1000001],St[1000001],Cn;
struct p{int q,w,mn,mx;bool operator < (const p &aa) const{return q<aa.q;}}t[1000001];
vector<p> ve1[1000001];
bool vi[1000001];
int fa[1000001];
int find(int qq){return qq==fa[qq]?qq:fa[qq]=find(fa[qq]);}
void intend(p qq)
{
if(qq.w<a&&vi[qq.w+1])
{
p nww=t[find(qq.w+1)];
ve1[get(min(qq.mn,nww.mn),max(qq.mx,nww.mx))].push_back(qq);
}
if(qq.q>1&&vi[qq.q-1])
{
p nww=t[find(qq.q-1)];
ve1[get(min(qq.mn,nww.mn),max(qq.mx,nww.mx))].push_back(nww);
}
}
void ins(int qq)
{
intend(t[qq]);
vi[qq]=1;
}
void merge(p qq,p ww)
{
int f1=find(qq.q),f2=find(ww.q);
fa[f2]=f1;
t[f1]=p{qq.q,ww.w,min(qq.mn,ww.mn),max(qq.mx,ww.mx)};
intend(t[f1]);
}
int cnn=0;
struct pp{int q,w,e;}g[1000001];
void ins(int qq,int ww,int ee)
{
g[++cnn]=pp{qq,ww,ee};
}
int cn1=0,cn2=0;
struct ppp{int q,w,e,r,fl;};
vector<ppp> tmp;
struct p1{int q,w,e;}stt1[1000001],stt2[1000001];
void ins(int qq,int ww,int ee,int tt,int fl)
{
tmp.push_back(ppp{qq,ww,ee,tt,fl});
}
bool cmp(ppp qq,ppp ww)
{
if(qq.q==ww.q) return qq.fl<ww.fl;
return qq.q<ww.q;
}
bool cmp1(p1 qq,p1 ww){return qq.q<ww.q;}
int u[1000001];
int lowbit(int qq){return qq&(-qq);}
int query(int qq)
{
int mx=0;
for(int i=qq;i;i-=lowbit(i)) mx=max(mx,u[i]);
return mx;
}
void change(int qq,int ww)
{
for(int i=qq;i<=a;i+=lowbit(i))
{
if(!vii[i]) St[++Cn]=i,vii[i]=1;
u[i]=max(u[i],ww);
}
}
vector<ppp> solve(vector<ppp> &qq)
{
if(qq.size()==1) return qq;
vector<ppp> tmp1,tmp2;
int mid=qq.size()/2;
for(int i=0;i<mid;i++) tmp1.push_back(qq[i]);
for(int i=mid;i<qq.size();i++) tmp2.push_back(qq[i]);
vector<ppp> t1=solve(tmp1);
vector<ppp> t2=solve(tmp2);
cn1=0,cn2=0;
for(int i=0;i<t1.size();i++)
{
if(!t1[i].fl)
{
stt1[++cn1]=p1{t1[i].w,t1[i].e,t1[i].r};
}
}
for(int i=0;i<t2.size();i++)
{
if(t2[i].fl)
{
stt2[++cn2]=p1{t2[i].w,t2[i].e,t2[i].r};
}
}
int ll=1;
Cn=0;
int mnn=1e9;
for(int i=1;i<=cn2;i++)
{
while(ll<=cn1&&stt1[ll].q<=stt2[i].q)
{
mnn=min(mnn,stt1[ll].e);
change(stt1[ll].w,stt1[ll].e);
++ll;
}
if(stt2[i].w>=mnn) ans[stt2[i].e]=max(ans[stt2[i].e],query(stt2[i].w));
}
for(int i=1;i<=Cn;i++) u[St[i]]=0,vii[St[i]]=0;
vector<ppp> t3;
int l1=0,l2=0;
while(l1<t1.size()&&l2<t2.size())
{
if(t1[l1].w<=t2[l2].w) t3.push_back(t1[l1]),++l1;
else t3.push_back(t2[l2]),++l2;
}
while(l1<t1.size()) t3.push_back(t1[l1]),++l1;
while(l2<t2.size()) t3.push_back(t2[l2]),++l2;
return t3;
}
struct seg{int mn,mx1,mx2;}l[2000001];
struct p2{int q,w;}st3[1000001];
int query(int x,int ll,int rr,int qq,int ww,int ee)
{
if(ll>=qq&&rr<=ww)
{
if(!ee) return l[x].mn;
if(ee==1) return l[x].mx1;
return l[x].mx2;
}int mid=((ll+rr)>>1);
if(mid>=ww) return query(x<<1,ll,mid,qq,ww,ee);
if(mid<qq) return query(x<<1|1,mid+1,rr,qq,ww,ee);
if(!ee) return min(query(x<<1,ll,mid,qq,ww,ee),query(x<<1|1,mid+1,rr,qq,ww,ee));
return max(query(x<<1,ll,mid,qq,ww,ee),query(x<<1|1,mid+1,rr,qq,ww,ee));
}
int Get(int qq,int ww)
{
int t1=query(1,1,a,qq,ww,0);
int t2=query(1,1,a,qq,ww,1);
return get(t1,t2);
}
void build(int x,int ll,int rr)
{
if(ll==rr)
{
l[x].mn=dfn[ll],l[x].mx1=dfn[ll],l[x].mx2=de[ll];
return;
}int mid=((ll+rr)>>1);
build(x<<1,ll,mid),build(x<<1|1,mid+1,rr);
l[x].mn=min(l[x<<1].mn,l[x<<1|1].mn);
l[x].mx1=max(l[x<<1].mx1,l[x<<1|1].mx1);
l[x].mx2=max(l[x<<1].mx2,l[x<<1|1].mx2);
}
inline int read(){int x=0;char c=getchar();while(c<'0'||c>'9'){c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x;}
int cn3;
bool cmp2(p2 qq,p2 ww){if(qq.q==ww.q) return qq.w>ww.w;return qq.q<ww.q;}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
for(int i=1;i<=1000000;i++) lg[i]=lg[i-1]+((1<<lg[i-1])==i);
for(int i=1;i<=1000000;i++) lg[i]--;
a=read();
for(int i=1;i<a;i++)
{
q=read(),w=read();
qu[q].push_back(w);
qu[w].push_back(q);
}
dfs(1,0);
for(int i=1;i<=19;i++)
{
for(int j=1;j+(1<<i)-1<=cnt;j++) st[i][j]=Min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
}
build(1,1,a);
for(int i=1;i<=a;i++)
{
ve[de[i]].push_back(i);
}
for(int i=1;i<=a;i++) fa[i]=i,t[i]=p{i,i,dfn[i],dfn[i]};
for(int i=a;i>=1;i--)
{
for(int j=0;j<ve[i].size();j++)
{
ins(ve[i][j]);
}
cn3=0;
for(int j=0;j<ve1[i].size();j++)
{
p nww=t[find(ve1[i][j].q)];
if(nww.q==ve1[i][j].q&&nww.w==ve1[i][j].w)
{
p nww1=t[find(ve1[i][j].w+1)];
if(get(min(nww.mn,nww1.mn),max(nww.mx,nww1.mx))==i)
{
st3[++cn3]=p2{nww.q,nww1.w};
merge(nww,nww1);
}
}
}
sort(st3+1,st3+cn3+1,cmp2);
long long mxx=0;
for(int j=1;j<=cn3;j++)
{
if(st3[j].w>mxx)
{
ins(st3[j].q,st3[j].w,i);
mxx=st3[j].w;
}
}
}
b=read();
for(int i=1;i<=cnn;i++)
{
ins(a-g[i].q+1,g[i].w,a-(g[i].w-g[i].q+1)+1,g[i].e,0);
}
for(int i=1;i<=b;i++)
{
q=read(),w=read(),e=read();
if(e==1)
{
ans[i]=query(1,1,a,q,w,2);
}
else
{
if(e==w-q+1) ans[i]=Get(q,q+e-1);
else ans[i]=max(Get(q,q+e-1),Get(w-e+1,w));
ins(a-q+1,w,a-e+1,i,1);
}
}
sort(tmp.begin(),tmp.end(),cmp);
solve(tmp);
for(int i=1;i<=b;i++) printf("%d\n",ans[i]);
return 0;
}