structEdge{ int x, y; int len; booloperator<(const Edge& o) const{ return len < o.len; } };
int f[MAXN]; int len[MAXN]; vector<Edge> v;
intfind(int x){ return (f[x] == x ? x : f[x] = find(f[x])); }
boolisSameSet(int x, int y){ return (find(x) == find(y)); }
voidUnion(int x, int y){ int f_x = f[x]; int f_y = f[y]; if(find(f_x) != find(f_y)){ f[f_y] = f_x; } }
intmain(){ int n, m; // n nodes, m edges cin >> n >> m; bool found = true; for(int i=1; i<=n; ++i){ f[i] = i; len[i] = 0; } int x, y, z; // x to y with len z for(int i=1; i<=m; ++i){ cin >> x >> y >> z; v.push_back({x, y, z}); } sort(v.begin(), v.end()); int total = 0; for(Edge e : v){ if(!isSameSet(e.x, e.y)){ total += e.len; Union(e.x, e.y); } } for(int i=2; i<=n; ++i){ if(find(1) != find(i)){ found = false; break; } } if(!found) cout << "orz\n"; else cout << total << '\n'; return0; }