#include<bits/stdc++.h>usingnamespace std;#definereregister#defineilinline
il intread(){
re int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*f;}//快读,不理解的同学用cin代替即可#defineinf123456789#definemaxn5005#definemaxm200005structedge{int v,w,next;}e[maxm<<1];//注意是无向图,开两倍数组int head[maxn],dis[maxn],cnt,n,m,tot,now=1,ans;//已经加入最小生成树的的点到没有加入的点的最短距离,比如说1和2号节点已经加入了最小生成树,那么dis[3]就等于min(1->3,2->3)bool vis[maxn];//链式前向星加边
il voidadd(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;}//读入数据
il voidinit(){
n=read(),m=read();for(re int i=1,u,v,w;i<=m;++i){
u=read(),v=read(),w=read();add(u,v,w),add(v,u,w);}}
il intprim(){//先把dis数组附为极大值for(re int i=2;i<=n;++i){
dis[i]=inf;}//这里要注意重边,所以要用到minfor(re int i=head[1];i;i=e[i].next){
dis[e[i].v]=min(dis[e[i].v],e[i].w);}while(++tot<n)//最小生成树边数等于点数-1{
re int minn=inf;//把minn置为极大值
vis[now]=1;//标记点已经走过//枚举每一个没有使用的点//找出最小值作为新边//注意这里不是枚举now点的所有连边,而是1~nfor(re int i=1;i<=n;++i){if(!vis[i]&&minn>dis[i]){
minn=dis[i];
now=i;}}
ans+=minn;//枚举now的所有连边,更新dis数组for(re int i=head[now];i;i=e[i].next){
re int v=e[i].v;if(dis[v]>e[i].w&&!vis[v]){
dis[v]=e[i].w;}}}return ans;}intmain(){init();printf("%d",prim());return0;}
#include<bits/stdc++.h>usingnamespace std;#definereregister#defineilinline
il intread(){
re int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*f;}structEdge{int u,v,w;}edge[200005];int fa[5005],n,m,ans,eu,ev,cnt;
il boolcmp(Edge a,Edge b){return a.w<b.w;}//快排的依据(按边权排序)
il intfind(int x){while(x!=fa[x]) x=fa[x]=fa[fa[x]];return x;}//并查集循环实现模板,及路径压缩,不懂并查集的同学可以戳一戳代码上方的“并查集详解”
il voidkruskal(){sort(edge,edge+m,cmp);//将边的权值排序for(re int i=0;i<m;i++){
eu=find(edge[i].u), ev=find(edge[i].v);if(eu==ev){continue;}//若出现两个点已经联通了,则说明这一条边不需要了
ans+=edge[i].w;//将此边权计入答案
fa[ev]=eu;//将eu、ev合并if(++cnt==n-1){break;}//循环结束条件,及边数为点数减一时}}intmain(){
n=read(),m=read();for(re int i=1;i<=n;i++){
fa[i]=i;}//初始化并查集for(re int i=0;i<m;i++){
edge[i].u=read(),edge[i].v=read(),edge[i].w=read();}kruskal();printf("%d",ans);return0;}