//在学习最小生成树时,我刚接触的是并不是Kruskal算法,而是prim算法,prim算法的代码将在以后的随笔中给出。
//我的第一个并查集的程序就是最小生成树Kruskal算法,我个人觉得并查集是个好东西下面就是我给出的题目描述和代码。
//[题目描述]
// 输入n,m,n代表村子的数目,m表示村子之间路的条数,接下来m行,没行三个整数,x,y,d,起始位置,和这两个村子的距离,
//输出联通所有村子的最小路径。
//样例输入
//5 7
//1 5 23
//1 4 5
//1 2 17
//2 4 10
//2 3 30
//3 4 24
//3 5 7
//样例输出
//45
#include <iostream>
#include <cstdlib>
using namespace std;
const int maxn = 100000;
class Kruskal {
public:
int from,to,dis;
};
int father [maxn] = {0};
Kruskal p[maxn];
int cmp (const void *a,const void *b) {
Kruskal *A = (Kruskal *)a;
Kruskal *B = (Kruskal *)b;
return A->dis - B->dis;
}
int find (int i) {
if (father[i] == 0) return i;
if (father[father[i]] == 0) return father[i];
int pos = find (father[i]);
father [i] = pos;
return pos;
}
int main () {
int n,m,x,y;
cin >> n >> m;
for (int i = 0;i < m; i++) {
cin >> p[i].from >> p[i].to >> p[i].dis;
}
qsort(p,m,sizeof(p[0]),cmp);
int ans = 0;
for (int i = 0;i < m; i++) {
x = find (p[i].from);
y = find (p[i].to);
if (x != y) {
father[x] = y;
ans += p[i].dis;
}
}
cout << ans << endl;
}