int n, m; structEdge { int x, y, w; Edge(int a, int b, int c) : x(a), y(b), w(c) {} }; vector<Edge> edges; vector<int> fa;
boolcmp(Edge a, Edge b){ return a.w < b.w; }
intfind(int u){ if (u == fa[u]) return u; return fa[u] = find(fa[u]); } voidunite(int u, int v){ u = find(u); v = find(v); if (u != v) fa[u] = v; }
ll kruskal(){ sort(edges.begin(), edges.end(), cmp); ll total = 0; // 总权值 int cnt = 0; // 已选边数 for (auto &e : edges) { int x = find(e.x), y = find(e.y); if (x != y) { total += e.w; cnt++; unite(x,y); } if (cnt == n-1) break; } return cnt == n - 1 ? total : -1; // -1 表示不连通 }
intmain(){ cin >> n >> m; int u, v, w; for (int i = 0; i < m; i++) { cin >> u >> v >> w; edges.emplace_back(u, v, w); } fa.resize(n + 1); for (int i = 1; i <= n; i++) fa[i] = i;
ll ans = kruskal(); if (ans == -1) cout << "impossible\n"; cout << ans << '\n'; return0; }