#include <bits/stdc++.h>
using namespace std;
using ui = unsigned;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,l,r) for(int i=(l);i>=(r);--i)
#define repn(i,n) for(int i=0;i<(n);++i)
#define sizc(x) ((x).size())
#define allc(x) x.begin(),x.end()
#define fir first
#define sec second
constexpr int N = 5e5+5;
int n,m;
vector<int> G[N];
struct qwq{
int l,r,id;
};
vector<qwq> Q1[N],Q2[N];
vector<pair<int,int>> Q3[N];
vector<pair<int,int>> a1[N],a2[N],a3[N];
int tr[N<<1],ans[N];
void ins(int x,int y){
x+=n-1;
while(x&&tr[x]<y)tr[x]=y,x>>=1;
}
int qry(int l,int r){
l+=n-1,r+=n-1;
int ans=0;
while(l<=r){
if(l&1)ans=max(ans,tr[l++]);
if(~r&1)ans=max(ans,tr[r--]);
l>>=1,r>>=1;
}
return ans;
}
int dep[N],sz[N],hs[N];
void dfs1(int u,int fa){
dep[u]=dep[fa]+1;
sz[u]=1;
for(auto v:G[u]){
if(v==fa)continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[hs[u]])hs[u]=v;
}
}
struct dsu{
int fa[N];
void init(){
rep(i,0,n+1)fa[i]=i;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
x=find(x),y=find(y);
fa[x]=y;
}
}dsul,dsur;
int vist[N];
void dfs2(int u,int fa,bool kp){
for(auto v:G[u])if(v!=fa&&v!=hs[u])dfs2(v,u,0);
if(hs[u])dfs2(hs[u],u,1);
vector<int> vt{u};
dsul.merge(u,u-1);
dsur.merge(u,u+1);
for(auto v:G[u])if(v!=fa&&v!=hs[u]){
auto dfs=[&](auto &&self,int u,int fa)->void{
vt.push_back(u);
dsul.merge(u,u-1);
dsur.merge(u,u+1);
for(auto v:G[u])if(v!=fa)self(self,v,u);
};
dfs(dfs,v,u);
}
for(auto i:vt){
int l=dsul.find(i)+1,r=dsur.find(i)-1;
if(vist[l]==u)continue;
vist[l]=u;
a1[r-l+1].emplace_back(l,dep[u]);
a2[r-l+1].emplace_back(r,dep[u]);
a3[l].emplace_back(r,dep[u]);
}
if(!kp){
auto dfs=[&](auto &&self,int u,int fa)->void{
dsul.fa[u]=u;
dsur.fa[u]=u;
for(auto v:G[u])if(v!=fa)self(self,v,u);
};
dfs(dfs,u,fa);
}
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
rep(i,2,n){
int u,v;cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
cin>>m;
rep(i,1,m){
int l,r,k;cin>>l>>r>>k;
Q1[k].push_back({l,r-k+1,i});
Q2[k].push_back({l+k-1,r,i});
Q3[l].emplace_back(r,i);
}
dfs1(1,0);
dsul.init();
dsur.init();
dfs2(1,0,1);
per(i,n,1){
for(auto p:a1[i])ins(p.fir,p.sec);
for(auto p:Q1[i])ans[p.id]=qry(p.l,p.r);
}
memset(tr,0,sizeof(tr));
per(i,n,1){
for(auto p:a2[i])ins(p.fir,p.sec);
for(auto p:Q2[i])ans[p.id]=max(ans[p.id],qry(p.l,p.r));
}
memset(tr,0,sizeof(tr));
rep(i,1,n){
for(auto p:a3[i])ins(p.fir,p.sec);
for(auto p:Q3[i])ans[p.sec]=max(ans[p.sec],qry(p.fir,n));
}
rep(i,1,m)cout<<ans[i]<<'\n';
return 0;
}