#18 RE 了
只 RE 了一个点,系统信息: Exit code: 11
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int ans;
namespace T2{
int rt[800005],tree[80000005],le[80000005],ri[80000005],all;
int dep[800005];
int merge(int a,int b,int &res){
if(!a||!b)return a+b;
if(le[a]&&ri[b])res=max(res,tree[le[a]]+tree[ri[b]]);
if(ri[a]&&le[b])res=max(res,tree[ri[a]]+tree[le[b]]);
le[a]=merge(le[a],le[b],res);
ri[a]=merge(ri[a],ri[b],res);tree[a]=max(tree[a],tree[b]);
return a;
}
int ver[800005],ne[800005],head[800005],cnt,val[800005];
inline void link(int x,int y,int v){
ver[++cnt]=y;
ne[cnt]=head[x];
head[x]=cnt;val[cnt]=v;
}
void dfs(int x,int fi){
int res=-1e18;
for(int i=head[x];i;i=ne[i]){
int u=ver[i];
if(u==fi)continue;
dep[u]=dep[x]+val[i];
dfs(u,x);rt[x]=merge(rt[x],rt[u],res);
}
ans=max(ans,res-2*dep[x]);
}
}
namespace T1{
int ver[1600005],ne[1600005],head[1600005],cnt=1,val[1600005];
inline void link(int x,int y,int v){
ver[++cnt]=y;
ne[cnt]=head[x];
head[x]=cnt;val[cnt]=v;
}
int dep[800005],fa[800005];
vector<int> son[800005];
void init(int x,int fi){
for(int i=head[x];i;i=ne[i]){
int u=ver[i];
if(u==fi)continue;
dep[u]=dep[x]+val[i];fa[u]=val[i];
init(u,x);son[x].push_back(u);
}
}
inline void build(){
init(1,1);m=n;
for(int i=1;i<=n;i++)head[i]=0;cnt=1;
for(int i=1;i<=m;i++){
if(son[i].size()<3){
for(auto it:son[i]){
link(i,it,fa[it]);link(it,i,fa[it]);
}
}else {
int le=++m,ri=++m;
link(i,le,0);link(le,i,0);
link(i,ri,0);link(ri,i,0);
for(auto it:son[i])son[le].push_back(it),swap(le,ri);
}
}
}
int siz[800005],mxp[800005],rt;
bool vis[1600005];
void findrt(int x,int fi,int tot){
siz[x]=1;
for(int i=head[x];i;i=ne[i]){
int u=ver[i];
if(vis[i]||u==fi)continue;
findrt(u,x,tot);siz[x]+=siz[u];
mxp[i>>1]=max(siz[u],tot-siz[u]);
if(mxp[i>>1]<mxp[rt])rt=(i>>1);
}
}
int dis[800005],lst[800005];
vector<int> vec;
void dfs(int x,int fi){
vec.push_back(x);siz[x]=1;
for(int i=head[x];i;i=ne[i]){
int u=ver[i];
if(vis[i]||u==fi)continue;
dis[u]=dis[x]+val[i];
dfs(u,x);siz[x]+=siz[u];
}
}
void solve(int x){
mxp[rt=0]=n;findrt(x,x,siz[x]);
if(!rt)return ;vis[rt<<1]=vis[rt<<1|1]=1;
int L=ver[rt<<1],R=ver[rt<<1|1];
vec.clear();dis[L]=val[rt<<1];dfs(L,R);
for(auto it:vec){
if(it>n)continue;
T2::le[lst[it]]=++T2::all;lst[it]=T2::all;
T2::tree[lst[it]]=dis[it]+dep[it];
}
vec.clear();dis[R]=0;dfs(R,L);
for(auto it:vec){
if(it>n)continue;
T2::ri[lst[it]]=++T2::all;lst[it]=T2::all;
T2::tree[lst[it]]=dis[it]+dep[it];
}
solve(L);solve(R);
}
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
T1::link(x,y,z);T1::link(y,x,z);
}
for(int i=1;i<n;i++){
int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
T2::link(x,y,z);T2::link(y,x,z);
}
for(int i=1;i<=n;i++)T2::rt[i]=T1::lst[i]=++T2::all;
T1::siz[1]=n;T2::tree[0]=-1e18;
T1::build();T1::solve(1);T2::dfs(1,1);ans/=2;
for(int i=1;i<=n;i++)ans=max(ans,T1::dep[i]-T2::dep[i]);
printf("%lld",ans);
return 0;
}