#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define ll long long
#define ull unsigned ll
#define db double
#define pii pair<int,int>
#define vi vector<int>
#define e emplace
#define eb emplace_back
using namespace std;
const ll inf=1073741800,INF=4611686018427387000,MOD=1e9+7;
namespace FastIO
{
template<typename T> inline void read(T&x)
{
x=0;char ch=getchar();
while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
bool tf=(ch=='-')&&(ch=getchar());
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
tf?x=-x:0;
}
inline void write(int x,char ch=' ')
{
if(x<0)putchar('-'),x=-x;
char st[50];int top=0;
do st[++top]=x%10+'0',x/=10;while(x);
while(top)putchar(st[top--]);
ch!='~'?putchar(ch),0:0;
}
template<typename T,typename ...Args> inline void read(T&x,Args &...args){read(x),read(args...);}
}
using namespace FastIO;
namespace MTool
{
inline int Cadd(int x,int y){return x+y>=MOD?(x+y-MOD):(x+y);}
inline int Cdel(int x,int y){return x<y?(x-y+MOD):(x-y);}
inline int Cmul(int x,int y){return 1ll*x*y%MOD;}
inline void Madd(int&x,int y){x=(x+y>=MOD?(x+y-MOD):(x+y));}
inline void Mdel(int&x,int y){x=(x<y?(x-y+MOD):(x-y));}
inline void Mmul(int&x,int y){x=1ll*x*y%MOD;}
inline bool Mmax(int&x,int y){return y>x?x=y,1:0;}
inline void Mmin(int&x,int y){x=min(x,y);}
}
using namespace MTool;
namespace WrongAnswer_90
{
int n,m;
int ans[500010];
vi T[500010];
struct tup
{
int x,y,z;
tup(int _x=0,int _y=0,int _z=0){x=_x,y=_y,z=_z;}
};
tup b[500010];
namespace BF
{
int pos[500010];
namespace Segment
{
struct{int l,r,v;}t[2000010];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r,t[p].v=-inf;
if(l==r)return pos[l]=p,void();
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
}
void change(int x,int y)
{
x=pos[x];
while(x)
{
if(!Mmax(t[x].v,y))break;
x>>=1;
}
}
int ask(int p,int l,int r)
{
if(l<=t[p].l&&r>=t[p].r)return t[p].v;
if(r<=t[ls(p)].r)return ask(ls(p),l,r);
if(l>t[ls(p)].r)return ask(rs(p),l,r);
return max(ask(ls(p),l,r),ask(rs(p),l,r));
}
}
using namespace Segment;
namespace BIT
{
int TT[500010];
inline void Change(int x,int y){for(;x<=n;x+=x&-x)Mmax(TT[x],y);}
inline int Ask(int x){int s=-inf;for(;x;x-=x&-x)Mmax(s,TT[x]);return s;}
}
using namespace BIT;
set<pii> st[500010];
vector<pii> tmp[500010];
vector<pii> tmp2[500010];
int tat=0;
void ins(int x,int l,int r,int dp)
{
auto p=st[x].lower_bound(mp(l,r));
if(p==st[x].end()||p->fi!=r+1);
else r=p->se,st[x].erase(p);
auto q=st[x].lower_bound(mp(l,r));
if(q==st[x].begin()||(--q)->se!=l-1);
else l=q->fi,st[x].erase(q);
st[x].insert(mp(l,r));
tmp[r].eb(mp(l,dp));
tmp2[r-l+1].eb(mp(l,dp));
++tat;
}
void dfs(int x,int fa=0,int dep=1)
{
ins(x,x,x,dep);
for(auto to:T[x])if(to!=fa)dfs(to,x,dep+1);
for(auto to:T[x])if(to!=fa)
{
if(st[x].size()<st[to].size())swap(st[x],st[to]);
for(auto p:st[to])ins(x,p.fi,p.se,dep);
st[to].clear();
}
}
vector<pii> ve[500010];
vector<tup> ve2[500010];
void solve()
{
dfs(1);
for(int i=1;i<=m;++i)
{
ve[b[i].x+b[i].z-1].eb(mp(b[i].x,i));
ve2[b[i].z].eb(tup(b[i].x,b[i].y-b[i].z+1,i));
}
for(int i=n;i>=1;--i)
{
for(auto p:tmp[i])Change(p.fi,p.se);
for(auto p:ve[i])Mmax(ans[p.se],Ask(p.fi));
}
build(1,1,n);
for(int i=n;i>=1;--i)
{
for(auto p:tmp2[i])change(p.fi,p.se);
for(auto p:ve2[i])Mmax(ans[p.z],ask(1,p.x,p.y));
}
for(int i=1;i<=m;++i)write(ans[i],'\n');
}
}
namespace B
{
int dep[500010];
int tot,F[20][500010],dfn[500010];
inline int get(int x,int y){return dfn[x]<dfn[y]?x:y;}
inline int LCA(int x,int y)
{
if(x==y)return x;
if((x=dfn[x])>(y=dfn[y]))swap(x,y);
int k=__lg(y-x++);
return get(F[k][x],F[k][y-(1<<k)+1]);
}
void dfs(int x,int fa=0)
{
dep[x]=dep[fa]+1;
F[0][dfn[x]=++tot]=fa;
for(auto to:T[x])if(to!=fa)
dfs(to,x);
}
namespace Segment
{
struct{int l,r,v;}t[2000010];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)return t[p].v=l,void();
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
t[p].v=LCA(t[ls(p)].v,t[rs(p)].v);
}
int ask(int p,int l,int r)
{
if(l<=t[p].l&&r>=t[p].r)return t[p].v;
if(r<=t[ls(p)].r)return ask(ls(p),l,r);
if(l>t[ls(p)].r)return ask(rs(p),l,r);
return LCA(ask(ls(p),l,r),ask(rs(p),l,r));
}
}
using namespace Segment;
inline void solve()
{
dfs(1);
for(int i=1;i<20;++i)for(int j=1;j+(1<<i)-1<=n;++j)
F[i][j]=get(F[i-1][j],F[i-1][j+(1<<(i-1))]);
build(1,1,n);
for(int i=1;i<=m;++i)write(dep[ask(1,b[i].x,b[i].y)],'\n');
}
}
using namespace B;
inline void mian()
{
int x,y;
read(n);
for(int i=1;i<n;++i)read(x,y),T[x].eb(y),T[y].eb(x);
read(m);
int fl=1;
for(int i=1;i<=m;++i)
{
read(b[i].x,b[i].y,b[i].z);
fl&=(b[i].y-b[i].x+1)==b[i].z;
}
if(fl)return B::solve();
return BF::solve();
}
}
signed main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
db st=clock();
WrongAnswer_90::mian();
return 0;
}