#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; }