#include using namespace std; typedef long long ll; int n; vector t[500005]; int Sz[500005],z[500005],l[500005],ord[500005],dep[500005],dfn; bool vis[500005]; void dfs1(int c,int f){ Sz[c]=1,dep[c]=dep[f]+1; for(auto i:t[c]) if(i!=f)dfs1(i,c),Sz[c]+=Sz[i],z[c]=(Sz[z[c]]sz[y])swap(x,y); f[x]=y,sz[y]+=sz[x]; if(L[x]>1; add(l,mid,mid<<1,kr,s); if(kr>mid)add(mid+1,r,mid<<1|1,kr,s); } int query(int l,int r,int c,int k){ if(l==r)return tr[c]; int mid=(l+r)>>1; if(k<=mid)return max(tr[c],query(l,mid,mid<<1,k)); return max(tr[c],query(mid+1,r,mid<<1|1,k)); } void a1(int l,int r,int c,int k,int s){ if(l==r){ tr[c]=max(tr[c],s); return; } int mid=(l+r)>>1; if(k<=mid)a1(l,mid,mid<<1,k,s); else a1(mid+1,r,mid<<1|1,k,s); tr[c]=max(tr[mid<<1],tr[mid<<1|1]); } int q1(int l,int r,int c,int kl,int kr){ if(l>kr||r=kl&&r<=kr)return tr[c]; int mid=(l+r)>>1; return max(q1(l,mid,mid<<1,kl,kr),q1(mid+1,r,mid<<1|1,kl,kr)); } int out[500005]; int main(){ freopen("query.in","r",stdin); freopen("query.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0); cin>>n; la[n+1]=n+1; for(int i=1;i<=n;++i)ne[i]=la[i]=f[i]=L[i]=R[i]=i,sz[i]=1; for(int i=1,x,y;i>x>>y; t[x].emplace_back(y),t[y].emplace_back(x); } cin>>q; for(int i=1;i<=q;++i) cin>>b[i].l>>b[i].r>>b[i].k,b[i].num=i; dfs1(1,1); dfs2(1,1,0); sort(a+1,a+1+top,[](tg a,tg b){ return a.lb.r-b.l; }); sort(b+1,b+1+q,[](qwq a,qwq b){ return a.k>b.k; }); memset(tr,0,sizeof(tr)); for(int i=1,j=1;i<=q;++i){ while(j<=top&&a[j].r-a[j].l+1>=b[i].k)a1(1,n,1,a[j].l,a[j].s),++j; out[b[i].num]=max(out[b[i].num],q1(1,n,1,b[i].l,b[i].r-b[i].k+1)); } for(int i=1;i<=q;++i) cout<