#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
priority_queue<pair<int,int> >q;//1 dis, 2 未入标号
int dis[5005]={0};
int b[5005]={0};
int nxt[2000005]={0},head[2000005]={0},to[2000005]={0},v[2000005]={0};
int num=0;
void add(int x,int y,int z)
{
nxt[++num]=head[x];
head[x]=num;
to[num]=y;
v[num]=z;
}
int prime()
{
int ans=0,k=0;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++) dis[i]=2147483647; dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
if(k==n) break;
int x=q.top().second; q.pop();
if(b[x]==1) continue;
b[x]=1;k++;ans+=dis[x];
for(int i=head[x];i!=-1;i=nxt[i])
if(b[to[i]]==0 && dis[to[i]]>v[i])
{
dis[to[i]]=v[i];
q.push(make_pair(-dis[to[i]],to[i]));
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,z;
memset(nxt,-1,sizeof(nxt));
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
if(m<n-1) printf("orz");
else printf("%d",prime());
return 0;
}
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
struct edge
{
int x,y,v;
}ed[2000005]={0};
bool cmp(edge a,edge b)
{
return a.v<b.v;
}
int fa[5005]={0},size[5005]={0};
void Inti(int n)
{
for(int i=1;i<=n;i++) fa[i]=i;
}
int find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return ;
else if(size[fx]<size[fy]) fa[fx]=fy;
else if(size[fx]==size[fy]) fa[fx]=fy,size[fy]++;
else fa[fy]=fx;
}
int kk()
{
int ans=0;
Inti(n);
sort(ed+1,ed+m+1,cmp);
int k=0;
for(int i=1;i<=m;i++)
{
if(k==n-1) break;
else if(find(ed[i].x)!=find(ed[i].y))
{
k++;
merge(ed[i].x,ed[i].y);
ans+=ed[i].v;
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d%d",&ed[i].x,&ed[i].y,&ed[i].v);
if(m<n-1) printf("orz");
else printf("%d",kk());
return 0;
}