#include<cstdio>
#include<algorithm>
#define MAX 100001
using namespace std;
struct edge
{
int from, to, weight;
bool operator<(const edge& e2)
{
return weight < e2.weight;
}
};
int N, M;
int parent[MAX];
edge E[100001];
int find(int x) // find parent
{
if (x == parent[x])
return x;
else
// return find(parent[x]); // 경로 압축 안하는 경우
return parent[x] = find(parent[x]); // 경로 압축 하는 경우
}
void unite(int x, int y)
{
x = parent[x];
y = parent[y];
parent[x] = y;
}
int main(void)
{
scanf("%d %d", &N, &M);
//make-set
for(int i = 1; i <= N; i++)
parent[i] = i;
// edge init
int u, v, w; // from vertex, to vertex, weight
for (int i = 0; i < M; i++) {
scanf("%d %d %d", &u, &v, &w);
E[i] = { u, v, w };
}
// sort by cost
sort(E, E + M);
int i = 0;
int cnt = 0;
int sum = 0;
while (cnt < N-1)
{
u = E[i].from;
v = E[i].to;
if (find(u) != find(v))
{
unite(u, v);
cnt++;
sum += E[i].weight;
}
i++;
}
printf("%d", sum);
return 0;
}