#include<bits/stdc++.h>
using namespace std;
int n,m,head[5005],k,f[5005],ans,cnt;
struct edge
{
int next,to,dis;
}e[200005];
int find(int x)
{
while (x!=f[x]) x=f[x]=f[f[x]];
return x;
}
int cmp(edge x,edge y)
{
return x.dis<y.dis;
}
void kruskal()
{
sort(e+1,e+m+1,cmp);
for (int i=1;i<=m;++i)
{
int u=e[i].next,v=e[i].to;
if (find(u)==find(v)) continue;
ans+=e[i].dis;
f[u]=v;
if (++cnt==n-1) break;
}
}
int main()
{
cin>>n>>m;
for (int i=1;i<=m;++i)
{
cin>>e[i].next>>e[i].to>>e[i].dis;
}
for (int i=1;i<=n;++i) f[i]=i;
kruskal();
cout<<ans<<endl;
return 0;
}