#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int p[1000010];
int n ,m;
int sum = 0;
struct edge{
int a, b, w;
bool operator < (const edge &W)const
{
return w < W.w;
}
}edges[10000010];
int find(int x)
{
if(x != p[x]) p[x] = find(p[x]);
return (p[x]);
}
void kruskal()
{
int cnt = 0;
for(int i = 1;i <= n;i ++) p[i] = i;
for(int i = 0;i < m;i ++)
{
int a = edges[i].a,b = edges[i].b,w = edges[i].w;
a = find(a);
b = find(b);
if(find(a) != find(b))
{
p[a] = b;
cnt = cnt + 1;
sum = sum + w;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 0;i < m; i ++)
{
cin >> edges[i].a >> edges[i].b >> edges[i].w;
}
sort(edges, edges + m);
kruskal();
cout << sum;
return 0;
}