#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#define N 400010
using namespace std;
struct edge{
int u,v,w;
} e[N];
int n,m,ans,f[N],cnt;
inline int read(){
int f=0,x=0;
char ch=getchar();
while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
inline bool cmp(edge a,edge b){
return a.w<b.w;
}
inline int find(int v){
return f[v]==v?v:f[v]=find(f[v]);
}
inline bool merge(int x,int y){
int t1=find(x);
int t2=find(y);
if(t1!=t2){
f[t2]=t1;
return true;
}
return false;
}
int main(){
n=read();
m=read();
for(int i=1; i<=n; i++) f[i]=i;
for(int i=1; i<=m; i++){
e[i].u=read();
e[i].v=read();
e[i].w=read();
}
sort(e+1,e+m+1,cmp);//一定要e+m+1 不然无法遍历所有边
for(int i=1; i<=m; i++){
if(merge(e[i].u,e[i].v)){
cnt++;
ans+=e[i].w;
}
if(cnt==n-1) break;
}
if(cnt==n-1)
printf("%d",ans);
else printf("orz");
return 0;
}