#include
#include
#include
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 1e9;
int root[maxn];
int sz[maxn];
int find_root(int x) {
while(root[x] != x) {
root[x] = root[root[x]];
x = root[x];
}
return x;
}
bool check(int A, int B) {
int root_A = find_root(A);
int root_B = find_root(B);
return root_A == root_B;
}
void unite(int A, int B) {
int root_A = find_root(A);
int root_B = find_root(B);
if(root_A != root_B) {
if(sz[root_A] > sz[root_B]) {
root[root_B] = root[root_A];
sz[root_A] += sz[root_B];
}
else {
root[root_A] = root[root_B];
sz[root_B] += sz[root_A];
}
}
}
int main() {
for(int i = 0; i < maxn; i++) {
root[i] = i;
sz[i] = 1;
}
int n, m;
cin >> n >> m;
vector > > v;
for(int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
v.push_back(make_pair(c, make_pair(a, b)));
}
sort(v.begin(), v.end());
int MST = 0;
for(int i = 0; i < n; i++) {
int a = v[i].second.first;
int b = v[i].second.second;
int c = v[i].first;
if(!check(a, b)) {
unite(a, b);
MST += c;
}
}
cout << MST << endl;
return 0;
}