#include <iostream>
#include <algorithm>
using namespace std;
const int maxm=100000;
const int maxn=5000;
int tot;
struct edge{
int u,v,w;
}e[maxm*2];
int father[maxn];
void make(int n){
for(int i=0;i<n;i++) //初始化
father[i]=i; //令每个元素的父亲都是元素本身
}
int find(int x){
if(x!=father[x]) //若父亲不为本身,则寻找元素x的祖先
father[x]=find(father[x]); //通过寻找元素x父亲的父亲找到祖先
return father[x]; //返回元素x的祖先
}
int cmp(edge a,edge b){
return a.w<b.w;
}
void work(int i){
tot=tot+e[i].w;
}
bool kruskal(int n,int m){
int cnt=0;
make(n);
sort(e,e+m,cmp);
for(int i=1;i<=m;i++)
{
int u=e[i].u,v=e[i].v;
if(find(u)!=find(v))
{
father[find(u)]=find(v);
work(i);
cnt++;
}
if(cnt==n-1) break;
}
if(cnt!=n-1) return false;
return true;
}
int main(){
int N,M;
cin>>N>>M;
for(int i=1;i<=M;i++){
int X,Y,Z;
cin>>X>>Y>>Z;
e[i].u=X,e[i].v=Y,e[i].w=Z;
}
if(kruskal(N,M)) cout<<tot<<endl;
else cout<<"orz"<<endl;
return 0;
}