#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<pair<int,long long>>> g;
vector<int> parent_;
vector<long long> downv, bestv;
void dfs1(int u, int p){
parent_[u]=p;
long long mx = 0;
for(auto [v,w]: g[u]) if(v!=p){
dfs1(v,u);
mx = max(mx, w + downv[v]);
}
downv[u]=mx;
}
void dfs2(int u, int p){
// 先算子树
for(auto [v,w]: g[u]) if(v!=p) dfs2(v,u);
// 收集 gain
long long top1=0, top2=0; int who=-1;
for(auto [v,w]: g[u]) if(v!=p){
long long gval = w + downv[v];
if(gval > top1){ top2 = top1; top1 = gval; who=v; }
else if(gval > top2){ top2 = gval; }
}
long long res = downv[u]; // 不延伸主路径,只在 u 取一次侧枝
for(auto [v,w]: g[u]) if(v!=p){
long long side = (v==who ? top2 : top1);
res = max(res, w + bestv[v] + side);
}
bestv[u]=res;
}
int main(){
cin>>n;
g.assign(n+1, {});
for(int i=0;i<n-1;i++){
int u,v; long long w; cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
parent_.assign(n+1,0);
downv.assign(n+1,0);
bestv.assign(n+1,0);
dfs1(1,0);
dfs2(1,0);
cout << bestv[1] << '\n';
return 0;
}