#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e4 + 5;
struct Edge {
int u, v, c;
bool operator<(const Edge& other) const {
return c < other.c;
}
};
int n, m;
vector<int> adj[N];
vector<Edge> edges;
int p[N], sz[N];
void initSet() {
for (int u = 1; u <= n; u++) {
p[u] = u;
sz[u] = 1;
}
}
int findSet(int u) {
if (p[u] == u) return u;
return p[u] = findSet(p[u]);
}
bool unionSet(int u, int v) {
u = findSet(u);
v = findSet(v);
if (u == v) return false;
if (sz[u] < sz[v]) swap(u, v);
p[v] = u;
sz[u] += sz[v];
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v, c;
cin >> u >> v >> c;
edges.push_back({u, v, c});
}
// Thuật toán Kruskal
sort(edges.begin(), edges.end());
initSet();
int ans = 0;
for (Edge e : edges) {
if (unionSet(e.u, e.v)) ans += e.c;
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTQgKyA1OyAKCnN0cnVjdCBFZGdlIHsKCWludCB1LCB2LCBjOyAgIAoJYm9vbCBvcGVyYXRvcjwoY29uc3QgRWRnZSYgb3RoZXIpIGNvbnN0IHsKCQlyZXR1cm4gYyA8IG90aGVyLmM7IAoJfQp9OyAKCmludCBuLCBtOyAgCnZlY3RvcjxpbnQ+IGFkaltOXTsgCnZlY3RvcjxFZGdlPiBlZGdlczsgCgppbnQgcFtOXSwgc3pbTl07IAoKdm9pZCBpbml0U2V0KCkgewoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSB7CgkJcFt1XSA9IHU7ICAKCQlzelt1XSA9IDE7IAoJfQp9CgppbnQgZmluZFNldChpbnQgdSkgewoJaWYgKHBbdV0gPT0gdSkgcmV0dXJuIHU7IAoJcmV0dXJuIHBbdV0gPSBmaW5kU2V0KHBbdV0pOyAKfQoKYm9vbCB1bmlvblNldChpbnQgdSwgaW50IHYpIHsKCXUgPSBmaW5kU2V0KHUpOyAgCgl2ID0gZmluZFNldCh2KTsgCglpZiAodSA9PSB2KSByZXR1cm4gZmFsc2U7IAoJaWYgKHN6W3VdIDwgc3pbdl0pIHN3YXAodSwgdik7ICAKCXBbdl0gPSB1OyAgCglzelt1XSArPSBzelt2XTsgCglyZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdiwgYzsgCgkJY2luID4+IHUgPj4gdiA+PiBjOyAKCQllZGdlcy5wdXNoX2JhY2soe3UsIHYsIGN9KTsgCgl9CgoJLy8gVGh14bqtdCB0b8OhbiBLcnVza2FsCglzb3J0KGVkZ2VzLmJlZ2luKCksIGVkZ2VzLmVuZCgpKTsgICAKCglpbml0U2V0KCk7ICAKCglpbnQgYW5zID0gMDsgIAoJZm9yIChFZGdlIGUgOiBlZGdlcykgewoJCWlmICh1bmlvblNldChlLnUsIGUudikpIGFucyArPSBlLmM7ICAKCX0KCgljb3V0IDw8IGFucyA8PCAnXG4nOyAKfQ==