#include<bits/stdc++.h>
#define fi first
#define se second
#define Me(x,y) memset(x,y,sizeof x)
using namespace std;using ll=long long;using pii=pair<int,int>;
const int N=5e5+5;
#define Tp template<typename T>
#define Ts template<typename T,typename ...Ar>
namespace Debug{
Tp void _debug(char *f,T x){cerr<<f<<'='<<x<<endl;}
Ts void _debug(char *f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<',';_debug(f+1,y...);}
#ifdef LOCAL
#define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__)
#else
#define gdb(...) void()
#endif
}using namespace Debug;
int n,m;
vector<int> S[N];
int fa[N],d[N],tp[N],son[N],siz[N];
void dfs1(int x,int La){
fa[x]=La;d[x]=d[La]+1;siz[x]=1;
for(int i:S[x]) if(i^La) dfs1(i,x),siz[x]+=siz[i],siz[i]>siz[son[x]]&&(son[x]=i);
}
void dfs2(int x,int La){
tp[x]=La;if(son[x]) dfs2(son[x],La);
for(int i:S[x]) if(i^fa[x]&&i^son[x]) dfs2(i,i);
}
int LCA(int x,int y){
while(tp[x]^tp[y]){
if(d[tp[x]]<d[tp[y]]) swap(x,y);
x=fa[tp[x]];
}
return d[x]<d[y]?x:y;
}
int st[N],sh,ns[N];
pii seg[N];
vector<tuple<int,int,int> > e;
int q,X[N],Y[N],Z[N],ans[N];
namespace Tree{
const int k=(1<<19),N=k+5<<1;
int f[N];
void clr(){Me(f,-0x3f);}
void modify(int x,int y){
x+=k;
while(x&&y>f[x]) f[x]=y,x>>=1;
}
int qry(int x,int y){
int ans=0;
x+=k-1;y+=k+1;
while(x^y^1){
if(~x&1) ans=max(ans,f[x^1]);
if(y&1) ans=max(ans,f[y^1]);
x>>=1;y>>=1;
}
return ans;
}
}
vector<pii> Q[N],G[N];
void work_pre(){
Tree::clr();
for(int i=1;i<=n;i++) G[i].clear(),Q[i].clear();
for(auto [a,b,c]:e) G[b].emplace_back(a,c);
for(int i=1;i<=q;i++) Q[Y[i]].emplace_back(X[i],i);
for(int i=n;i;i--){
for(auto [x,y]:G[i]) Tree::modify(x,y);
for(auto [x,y]:Q[i]) ans[y]=max(ans[y],Tree::qry(1,x));
}
}
void work(){
Tree::clr();
for(int i=1;i<=n;i++) G[i].clear(),Q[i].clear();
for(auto [a,b,c]:e) G[b-a+1].emplace_back(b,c);
for(int i=1;i<=q;i++) Q[Z[i]].emplace_back(X[i],i);
for(int i=n;i;i--){
for(auto [x,y]:G[i]) Tree::modify(x,y);
for(auto [x,y]:Q[i]) ans[y]=max(ans[y],Tree::qry(X[y]+i-1,Y[y]));
}
}
void Solve(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
S[x].push_back(y);S[y].push_back(x);
}
dfs1(1,0);dfs2(1,1);
for(int i=1;i<=n;i++){
st[++sh]=i;seg[sh]=make_pair(i,i);
e.emplace_back(i,i,d[i]);
if(sh>1) ns[sh]=LCA(st[sh-1],st[sh]);
while(sh>=4&&d[ns[sh-2]]<=d[ns[sh-1]]&&d[ns[sh-1]]>=d[ns[sh]]){
sh--;
e.emplace_back(seg[sh-1].fi,seg[sh].se,d[ns[sh]]);
seg[sh-1].se=seg[sh].se;seg[sh]=seg[sh+1];
st[sh-1]=ns[sh];st[sh]=st[sh+1];
ns[sh]=ns[sh+1];
}
}
for(int i=2;i<=sh;i++) e.emplace_back(seg[i-1].fi,n,d[ns[i]]);
scanf("%d",&q);
for(int i=1;i<=q;i++) scanf("%d%d%d",&X[i],&Y[i],&Z[i]);
work_pre();
work();
for(auto &[x,y,z]:e) x=n-x+1,y=n-y+1,swap(x,y);
for(int i=1;i<=q;i++) X[i]=n-X[i]+1,Y[i]=n-Y[i]+1,swap(X[i],Y[i]);
work();
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
}
int main(){
freopen("query.in","r",stdin);freopen("query.out","w",stdout);
int t=1;
while(t--) Solve();
cerr<<clock()*1.0/CLOCKS_PER_SEC<<'\n';
}