rt
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_V = 100010;
const int MAX_E = 100010;
int V, E;
int fa[MAX_V];
long long ans;
struct edge{
int from, to, cost;
};
edge es[MAX_E];
bool cmp(edge a, edge b)
{
return a.cost < b.cost;
}
int find(int x)
{
int r = x;
while(r != fa[r])
r = fa[r];
int t;
while(x != r)
{
t = fa[x];
fa[x] = r;
x = t;
}
return r;
}
void kruskal()
{
for(int i = 1; i <= V; i ++)
fa[i] = i;
sort(es+1,es+E+1,cmp);
for(int i = 1; i <= E; i ++)
{
int fu = find(es[i].from);
int fv = find(es[i].to);
int val = es[i].cost;
if(fu != fv)
{
ans += val;
fa[fu] = fv;
}
}
}
int main()
{
scanf("%d%d",&V, &E);
for(int i = 1; i <= E; i ++)
{
int f, t, d;
scanf("%d%d%d",&f,&t,&d);
es[i] = (edge){f,t,d};
}
kruskal();
printf("%lld\n",ans);
return 0;
}