#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
const int maxv=2e5+10;
long long n,m,f[maxv];
long long ans;
struct edge{
int u,v,w;
};
edge g[maxn];
bool cmp(edge a,edge b){
return a.w<b.w;
}
int find(int a){
if(f[a]==a) return a;
f[a]=find(f[a]);
return f[a];
}
void kruskal(){
int cnt=0;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) {
int x=g[i].u,y=g[i].v;
int fx=find(x);
int fy=find(y);
if(fy!=fx){
f[fx]=fy;
ans+=g[i].w;
cnt++;
}
if(cnt==n-1) break;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&g[i].u,&g[i].v,&g[i].w);
sort(g+1,g+1+m,cmp);
kruskal();
cout<<ans;
}