#include<cstdio>
#include<vector>
#include<cstring>
#include<set>
#define maxn 5050
#define fi first
#define se second
using namespace std;
typedef pair<int,int> PII;
vector <PII> s[maxn];
int map[5001][5001];
int low_cost[maxn],zou[maxn],n,m,x,y,val,zhong,mi,ans;
int up(int x,int y,int val)
{
for(int i=0;i<s[x].size();i++)
{
if(s[x][i].fi==y )
{
if( s[x][i].se>val)
{
s[x][i].se=val;
}
return 1;
}
}
return 0;
}
main(){
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
memset(low_cost,127/3,sizeof(low_cost));
// memset(map,127/3,sizeof(map));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
if(x==y) continue;
// map[x][y]=min(map[x][y],val);
// map[y][x]=min(map[y][x],val);
if(up(x,y,val))
up(y,x,val);
else
{
s[x].push_back(PII(y,val));
s[y].push_back(PII(x,val));
}
}
for(int i=0;i<s[1].size();i++)
{
low_cost[s[1][i].fi]=s[1][i].se;
}
/* for(int i=2;i<=n;i++)
{
low_cost[i]=min(low_cost[i],map[1][i]);
}*/
zou[1]=1;
zhong=1;
for(int qwer=1;qwer<n;qwer++)
{
int f=0;
mi=1000000000;
for(int i=1;i<=n;i++)
{
if(low_cost[i]<mi && zou[i]==0)
{
mi=low_cost[i];
zhong=i;
f=1;
}
}
if(f==0)
{
printf("orz");
return 0;
}
ans+=mi;
zou[zhong]=1;
for(int i=0;i<s[zhong].size();i++)
{
if(zou[s[zhong][i].fi]==1) continue;
low_cost[s[zhong][i].fi]=min(low_cost[s[zhong][i].fi],s[zhong][i].se);
}
/* for(int i=1;i<=n;i++)
{
if(map[zhong][i]<low_cost[i])
low_cost[i]=map[zhong][i];
}*/
}
printf("%d",ans);
}