#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int cost[1020][1020];//cost[u][v]表示边e=(u,v)的权值
int mincost[1020];//从集合X出发的边到每个顶点的最小权值
bool used[1020];//顶点i是否包含在集合X中
int N,M,S,E,W;
int prime()
{
for(int i=1;i<=N;i++)
{
mincost[i]=INF;
used[i]=false;
}
mincost[1]=0;
int res=0;
while(true)
{
int v=-1;//从不属于X的顶点中选取从X到其权值最小的顶点
for(int u=1;u<=N;u++)
{
if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
v=u;
}
if(v==-1)break;
used[v]=true;//把顶点v加入X
res+=mincost[v];//把边的长度加到结果里
for(int u=1;u<=N;u++)
mincost[u]=min(mincost[u],cost[v][u]);
}
return res;
}
int main()
{
cin>>N>>M;
memset(cost,INF,sizeof(cost));
for(int i=0;i<M;i++)
{
cin>>S>>E>>W;
cost[S][E]=min(W,cost[S][E]);
cost[E][S]=min(W,cost[E][S]);
}
cout<<prime()<<endl;
return 0;
}