#8#9#10MLE #13TLE
我是直接存边,用两条有向边表示一条无向边
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
const int N=5005;
const int M=2e5+5;
int n,m,cnt,ans;
int fa[N];
struct B{
int u,v,w;
}edge[M];
struct cmp{
bool operator()(B a,B b){return a.w>b.w;}
};
priority_queue<B,vector<B>,cmp> q;
int find(int a){
if(fa[a]!=a) return fa[a]=find(fa[a]);
return fa[a];
}
void jianbian(int a,int b,int c){
edge[++cnt].u=a,edge[cnt].v=b,edge[cnt].w=c;
q.push(edge[cnt]);
}
void mix(int a,int b)
{
if(fa[a]==fa[b]) return ;
fa[a]=find(a),fa[b]=find(b);
fa[fa[b]]=fa[a];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
jianbian(a,b,c);jianbian(b,a,c);
}
//Kruskal
for(int i=1;i<=n-1;i++)
{
B t=q.top();
while(find(t.u)==find(t.v)) q.pop(),t=q.top();
ans+=t.w;
mix(t.v,t.u);
}
for(int i=2;i<=n;i++)
if(find(1)!=find(i))
{
cout<<"orz"<<endl;
return 0;
}
cout<<ans<<endl;
return 0;
}