#include <bits/stdc++.h>
using namespace std;
const int maxn=999999;
int n,m,pre[maxn],vis[maxn];
struct ege{//边的数组
int u,v,w;
}d[maxn];
bool com(ege a,ege b){//按边的权值进行排序
return a.w<b.w;
}
int find(int x){
if(x!=pre[x]) pre[x]=find(pre[x]);
return pre[x];
}
void join(int q,int w){
pre[find(q)]=find(w);
return;
}
int kur(){//生成树
for(int i=1;i<=n;i++) pre[i]=i;
int j=1,ans=0;
for(int i=1;i<=n-1;i++)//找n-1条边
{
for(;j<=m;j++)
{
if(find(d[j].u)!=find(d[j].v))
{
join(d[j].u,d[j].v);
ans+=d[j].w;
break;
}
}
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>d[i].u>>d[i].v>>d[i].w;
sort(d+1,d+1+m,com);
cout<<kur();
}