//Minimum Spanning Tree----Kruskal算法
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m;//顶点数,边数
int s[N];
struct Edge{
int u,v,w;
}e[N];//待修改
int find(int x)//并查集
{
return s[x]==x?x:s[x]=find(s[x]);
}
bool cmp(Edge a,Edge b)
{
return a.w<b.w;
}
int kruskal()
{
for(int i=1;i<=n;i++) s[i]=i;
sort(e+1,e+1+m,cmp);//注意排序长度是m!!!!!!
int ans=0,cnt=0;
for(int i=1;i<=m;i++)
{
int a=find(e[i].u),b=find(e[i].v);
if(a==b) continue;
s[a]=b;
ans+=e[i].w;
cnt++;
if(cnt>=n-1) break;
}//循环结束后,cnt<n-1,说明图仍未连通
return ans;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
cout<<kruskal();
}
24/8/1