#include<bits/stdc++.h> const int N=1e6+50; int n, m, min[N],out[N],f[N],siz[N],ans; struct edge { int u, v, w; } e[N]; inline int find(int x) { while (x!=f[x]) x=f[x]=f[f[x]]; return x; } inline void merge(int x,int y) { if (siz[x]>siz[y]) std::swap(x,y); f[x]=y; } int main() { scanf ("%d%d", &n, &m); for (int i=1; i<=n; ++i) { f[i]=i,siz[i]=1; } for (int i=1; i<=m; ++i) { scanf ("%d%d%d", &e[i].u,&e[i].v,&e[i].w); } int components=n; while (components>1) { memset (min,0x3f,sizeof (min)); for (int i=1; i<=m; ++i) { int u=find(e[i].u),v=find(e[i].v),w=e[i].w; if (u!=v) { if (w<min[u]) min[u]=w,out[u]=v; if (w<min[v]) min[v]=w,out[v]=u; } } for (int i=1; i<=n; ++i) { int x=find(i) ; if (out[x]) { int y=find(out[x]); if (x!=y) { merge(x,y); --components; ans+=min[x]; } } } } printf("%d",ans); return 0; }