#include #include #include #include #include using namespace std; #define MAX_V 200010 #define INF 1e17 typedef long long ll; struct Edge { int to; ll cost; Edge(int to, ll cost) : to(to), cost(cost) {} }; int V; ll maxi; int start; ll dist[MAX_V]; bool visited[MAX_V]; vector G[MAX_V]; void getStart(int v, ll d) { if (dist[v] < INF) return; dist[v] = d; if (maxi < d) { maxi = d; start = v; } for (int i = 0; i < (int)G[v].size(); i++) { Edge e = G[v][i]; getStart(e.to, d+e.cost); } } ll getTreeDiameter(int v) { ll res = 0; for (int i = 0; i < (int)G[v].size(); i++) { Edge e = G[v][i]; if (!visited[e.to]) { visited[e.to] = true; res = max(res, e.cost+getTreeDiameter(e.to)); } } return res; } int main() { int a, b; ll w; cin >> V; for (int i = 0; i < V-1; i++) { cin >> a >> b >> w; a--; b--; G[a].push_back(Edge(b, w)); G[b].push_back(Edge(a, w)); } maxi = 0; fill(dist, dist+V, INF); getStart(0, 0); memset(visited, false, sizeof(visited)); visited[start] = true; cout << getTreeDiameter(start) << endl; return 0; }