#include<stdio.h>
#include<map>
#include<string.h>
#include<algorithm>
#define N 500009
#define lc ((i)<<1|1)
#define rc ((i)+1<<1)
using namespace std;
inline char nc()
{
static char buf[99999],*l,*r;
return l==r&&(r=(l=buf)+fread(buf,1,99999,stdin),l==r)?EOF:*l++;
}
inline void read(int&x)
{
char c=nc();for(;c<'0'||'9'<c;c=nc());
for(x=0;'0'<=c&&c<='9';x=(x<<3)+(x<<1)+(c^48),c=nc());
}
int n,m,q,h[N],e[N<<1],nxt[N<<1],ans[N],szsz[N],tre[N<<2];
map<int,int>mmp;
struct node{int l,r,k,id;}a[N<<1],b[N];
inline bool cmp1(const node&x,const node&y){return x.l<y.l;}
inline bool cmp2(const node&x,const node&y){return x.r>y.r;}
inline bool cmp3(const node&x,const node&y){return x.r-x.l>y.r-y.l;}
inline bool cmp4(const node&x,const node&y){return x.k>y.k;}
inline map<int,int>dfs(int i,int f,int dep)
{
map<int,int>u;u[i]=i;a[m++]=(node){i,i,dep};
for(int j=h[i];j;j=nxt[j])if(e[j]^f)
{
map<int,int>v=dfs(e[j],i,dep+1);
if(u.size()<v.size())u.swap(v);
for(map<int,int>::iterator it=v.begin();it!=v.end();++it)
{
map<int,int>::iterator i=u.emplace(*it).first,j=i;
bool ok=0;
if(j!=u.begin())
{
--j;
if(j->second+1==i->first)
{
ok=1;
j->second=i->second;
u.erase(i);i=j;
}
}
j=i;++j;
if(j!=u.end())if(i->second+1==j->first)
{
ok=1;
i->second=j->second;
u.erase(j);
}
if(ok)a[m++]=(node){i->first,i->second,dep};
}
}
return u;
}
inline void max(int&x,int y){if(x<y)x=y;}
inline void upd(int i,int x){for(;i<=n;max(szsz[i],x),i+=i&-i);}
inline int qry(int i){int ans=0;for(;i;max(ans,szsz[i]),i&=i-1);return ans;}
inline void upd(int i,int l,int r,int p,int x)
{
max(tre[i],x);
if(l==r)return;
int mid=l+r>>1;
if(p<=mid)upd(lc,l,mid,p,x);
else upd(rc,mid+1,r,p,x);
}
inline int qry(int i,int l,int r,int ql,int qr)
{
if(qr<l||r<ql)return 0;
if(ql<=l&&r<=qr)return tre[i];
int mid=l+r>>1;
int x=qry(lc,l,mid,ql,qr);
max(x,qry(rc,mid+1,r,ql,qr));
return x;
}
main()
{
freopen("query.in","r",stdin);freopen("query.out","w",stdout);
read(n);
for(int i=1,u,v;i<n;++i)read(u),read(v),--u,--v,
e[i]=v,nxt[i]=h[u],h[u]=i,
e[i+n]=u,nxt[i+n]=h[v],h[v]=i+n;
dfs(0,0,1);
read(q);
for(int i=0;i<q;++i)read(b[i].l),--b[i].l,read(b[i].r),--b[i].r,
read(b[i].k),b[i].id=i;
sort(a,a+m,cmp1);sort(b,b+q,cmp1);
for(int i=0,j=0;j<q;)if(i<m&&a[i].l<b[j].l)
upd(n-a[i].r,a[i].k),++i;
else max(ans[b[j].id],qry(n-(b[j].l+b[j].k-1))),++j;
sort(a,a+m,cmp2);sort(b,b+q,cmp2);memset(szsz,0,sizeof(szsz));
for(int i=0,j=0;j<q;)if(i<m&&a[i].r>b[j].r)
upd(a[i].l+1,a[i].k),++i;
else max(ans[b[j].id],qry(b[j].r-b[j].k+1+1)),++j;
sort(a,a+m,cmp3);sort(b,b+q,cmp4);
for(int i=0,j=0;j<q;)if(i<m&&a[i].r-a[i].l+1>=b[j].k)
{
map<int,int>::iterator it=mmp.upper_bound(a[i].l);
if(it!=mmp.begin())
{
--it;
if(it->first<=a[i].l&&a[i].r<=it->second)mmp.erase(it);
}
mmp[a[i].l]=a[i].r;
upd(0,0,n-1,a[i].r,a[i].k);++i;
}
else
{
map<int,int>::iterator it=mmp.lower_bound(b[j].l);
if(it!=mmp.end())
max(ans[b[j].id],qry(0,0,n-1,it->first,b[j].r));
++j;
}
for(int i=0;i<q;printf("%d\n",ans[i++]));
}