kruskal
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
const int M=200001;
struct st{int x,y,w;}edge[M];
bool cmp(st a,st b){return a.w<b.w;}//按边排序
int n,m,father[M];
int find(int x)//找祖先
{
if(father[x]==x)return x;
return father[x]=find(father[x]);//压缩路径
}
int ans=0,k=0;
int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;i++)father[i]=i;
for(int i=1;i<=m;i++)
edge[i].x=rd(),edge[i].y=rd(),edge[i].w=rd();
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++){//从小到大枚举边
int a=find(edge[i].x),b=find(edge[i].y);//找祖先
//祖先不一样加入集合
if(a!=b){
father[b]=a;
ans+=edge[i].w;
k++;//边数加一
if(k==n-1)//成为一棵树
{printf("%d",ans);return 0;}
}
}
printf("orz");
return 0;
}