#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
typedef long long int ll;
const int N = 100005;
int n, m;
int dad[N / 20];
struct edge
{
int a;
int b;
int v;
bool operator<(edge e) const
{
return v < e.v;
}
} ed[N];
inline void init()
{
for (int i = 1; i < n + 1; i++)
dad[i] = i;
}
inline int find(int x)
{
return x == dad[x] ? x : (dad[x] = find(dad[x]));
}
inline void merge(int x, int y)
{
dad[find(x)] = find(y);
}
int main()
{
ios::sync_with_stdio(false);
int total = 0;
ll ans = 0;
cin >> n >> m;
init();
for (int i = 1; i < m + 1; i++)
cin >> ed[i].a >> ed[i].b >> ed[i].v;
sort(ed + 1, ed + 1 + m);
for (int i = 1; i < m + 1; i++)
{
int aa = find(ed[i].a), bb = find(ed[i].b);
if (aa != bb)
{
dad[aa] = bb;
ans += ed[i].v;
total++;
}
else
continue;
if (total == n - 1)
{
cout << ans;
return 0;
}
}
}