#include #include #include #include #include #include #include #include using namespace std; #define rep(i, n) for (int i = 0; i < (n); i++) typedef long long ll; template struct Edge { int to; T cost; }; template< typename T > using WeightedGraph = vector>>; template< typename T > tuple dfs(const WeightedGraph< T > &g, int idx, int par) { tuple ret(numeric_limits::lowest(), idx, 0); bool has_child = false; for(auto &e : g[idx]) { if(e.to == par) continue; has_child = true; auto cost = dfs(g, e.to, idx); std::get<0>(cost) += e.cost; std::get<2>(cost) += 1; if (std::get<0>(cost) > std::get<0>(ret) || (std::get<0>(cost) == std::get<0>(ret) && std::get<2>(cost) < std::get<2>(ret))) { ret = cost; } } if (!has_child) { return make_tuple(0, idx, 0); } return ret; } template< typename T > T tree_diameter(const WeightedGraph< T > &g) { if (g.size() <= 1) return 0; auto p = dfs(g, 0, -1); auto q = dfs(g, std::get<1>(p), -1); return std::get<0>(q); } signed main() { int N; cin >> N; WeightedGraph g(N); rep(i, N - 1) { int u, v; ll w; cin >> u >> v >> w; u--; v--; g[u].emplace_back(Edge{v, w}); g[v].emplace_back(Edge{u, w}); } cout << std::max(0LL, tree_diameter(g)) << endl; }