#include<iostream>#include<cstdio>#include<algorithm>#define ll long longusingnamespacestd;
int n,m;
constint size = 2000010;
struct edge
{
int f,t,d;
}l[size];
bool cmp(edge a,edge b)
{
return a.d < b.d;
}
int f[size];
int find(int x)
{
if(f[x] == x)
return x;
elsereturn f[x] = find(f[x]);
}
int main()
{
cin>>n>>m;
for(int i = 1 ; i <= n ; i ++) // 初始化并查集
f[i] = i;
for(int i = 1 ; i <= m ; i ++)
cin>>l[i].f>>l[i].t>>l[i].d;
sort(l+1,l+1+m,cmp); // 贪心
ll ans = 0;
for(int i = 1 ; i <= m ; i ++)
{
int x = find(l[i].f);
int y = find(l[i].t); // 找祖宗环节 if(x != y) // 如果这个边的两个点还没有被已选的边连接
{
ans += l[i].d;
f[x] = y;// 点 f 和 t 的祖宗连接
}
}
cout<<ans<<endl;
return0;
}