#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
#define all(x) (x).begin(),(x).end()
#ifdef DEBUG
template<class T>
ostream& operator << (ostream &out,vector<T>a){
out<<'[';
for(auto x:a)out<<x<<',';
return out<<']';
}
template<class T>
auto ary(T *a,int l,int r){
return vector<T>{a+l,a+1+r};
}
template<class T>
void debug(T x){
cerr<<x<<endl;
}
template<class T,class...S>
void debug(T x,S...y){
cerr<<x<<' ',debug(y...);
}
#else
#define debug(...) void()
#endif
const int N=5e5+10,K=__lg(N)+1;
int n,m,k,ans[N];
vector<int>to[N];
struct node{
int l,r,x,id;
}o[N],q[N];
int fa[N],siz[N],son[N],dep[N],top[N];
void dfs1(int u){
dep[u]=dep[fa[u]]+1,siz[u]=1;
for(int v:to[u])if(v^fa[u]){
fa[v]=u,dfs1(v);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
int dft,bg[N],ed[N],pos[N];
void dfs2(int u,int t){
top[u]=t,pos[bg[u]=++dft]=u;
if(son[u])dfs2(son[u],t);
for(int v:to[u])if(v^fa[u]&&v^son[u])dfs2(v,v);
ed[u]=dft;
}
int LCA(int u,int v){
for(;top[u]^top[v];u=fa[top[u]]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
}
return dep[u]<dep[v]?u:v;
}
struct seg{
int l,r;
}f[K][N];
int g[K][N];
seg operator + (const seg &a,const seg &b){
return {min(a.l,b.l),max(a.r,b.r)};
}
bool operator <= (const seg &a,const seg &b){
return b.l<=a.l&&a.r<=b.r;
}
namespace BIT{
int c[N];
void add(int x,int y){
for(;x&&c[x]<y;x^=x&-x)c[x]=y;
}
void get(int x,int &y){
for(;x<=n;x+=x&-x)c[x]>y&&(y=c[x]);
}
void clr(int x){
for(;x&&c[x];x^=x&-x)c[x]=0;
}
}
struct opts{
int x,l,r,y;
}s[N*2];
int cnt;
void divide(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
divide(l,mid);
divide(mid+1,r);
int j=mid+1;
for(int i=l;i<=mid;i++){
for(;j<=r&&s[j].r<=s[i].r;j++){
if(s[j].y<0)BIT::add(s[j].l,-s[j].y);
}
if(s[i].y>0){
BIT::get(s[i].l,ans[s[i].y]);
}
}
for(;--j>=mid+1;)if(s[j].y<0)BIT::clr(s[j].l);
inplace_merge(s+l,s+1+mid,s+1+r,[&](opts a,opts b){
return a.r<b.r;
});
}
void solve1(){
for(int i=1;i<=m;i++){
s[++cnt]={q[i].x,q[i].l,q[i].r,q[i].id};
}
for(int i=1;i<=k;i++){
s[++cnt]={o[i].r-o[i].l+1,o[i].l,o[i].r,-o[i].x};
}
sort(s+1,s+1+cnt,[&](opts a,opts b){
return a.x!=b.x?a.x<b.x:a.y>b.y;
});
divide(1,cnt);
}
void solve2(){
sort(o+1,o+1+k,[&](node a,node b){
return a.l<b.l;
});
sort(q+1,q+1+m,[&](node a,node b){
return a.l<b.l;
});
int x=1;
for(int i=1;i<=m;i++){
for(;x<=k&&o[x].l<=q[i].l;x++){
BIT::add(o[x].r,o[x].x);
}
BIT::get(q[i].l+q[i].x-1,ans[q[i].id]);
}
for(;--x>=1;)BIT::clr(o[x].r);
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
scanf("%d",&n);
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
to[u].push_back(v),to[v].push_back(u);
}
dfs1(1),dfs2(1,1);
for(int i=1;i<=n;i++)f[0][i]={bg[i],bg[i]},g[0][i]=dep[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
f[i][j]=f[i-1][j]+f[i-1][j+(1<<i-1)];
g[i][j]=max(g[i-1][j],g[i-1][j+(1<<i-1)]);
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].x);
q[i].id=i;
if(q[i].x==1){
int k=__lg(q[i].r-q[i].l+1);
ans[i]=max(g[k][q[i].l],g[k][q[i].r-(1<<k)+1]);
}
}
for(int i=1;i<n;i++){
int t=LCA(i,i+1),x=i,y=i+1;
seg p={bg[t],ed[t]};
for(int k=__lg(n);k>=0;k--){
if(y+(1<<k)<=n&&f[k][y+1]<=p)y+=1<<k;
}
for(int k=__lg(n);k>=0;k--){
if(x-(1<<k)>=1&&f[k][x-(1<<k)]<=p)x-=1<<k;
}
o[++k]={x,y,dep[t],0};
}
solve1();
solve2();
auto rev=[&](int &x,int &y){
swap(x,y),x=n-x+1,y=n-y+1;
};
for(int i=1;i<=m;i++)rev(q[i].l,q[i].r);
for(int i=1;i<=k;i++)rev(o[i].l,o[i].r);
solve2();
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}