#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// Множество рёбер: вес -> (вершина u, вершина v)
set<pair<int, pair<int, int>>> edges;
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
edges.insert({w, {u, v}});
}
vector<bool> inTree(n + 1, false); // помечает вершины, уже добавленные в остов
// Берём самое лёгкое ребро как начальное
auto it = edges.begin();
int u = it->second.first;
int v = it->second.second;
int totalWeight = it->first;
inTree[u] = inTree[v] = true;
edges.erase(it);
// Добавляем оставшиеся n-2 ребра (по алгоритму Прима)
for (int k = 0; k < n - 2; ++k) {
for (auto it2 = edges.begin(); it2 != edges.end(); ++it2) {
int a = it2->second.first;
int b = it2->second.second;
if (inTree[a] != inTree[b]) { // соединяет дерево с новой вершиной
totalWeight += it2->first;
inTree[a] = inTree[b] = true;
edges.erase(it2);
break;
}
}
}
cout << totalWeight << endl;
return 0;
}