rt
#include <iostream>
#include <queue>
using namespace std;
const int N=5001,M=2e5+1,MAX=0x3f3f3f;
int head[N],n,m,cnt=1,dis[N];
bool vis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
struct node{
int next,to,w;
}e[M];
void add(int u,int v,int w){
e[cnt].w=w;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt++;
return ;
}
void prim(){
for(int i=1;i<=n;i++) dis[i]=MAX;
dis[1]=0;
pq.push(make_pair(0,1));
int now;
while(!pq.empty()){
now=pq.top().second;
pq.pop();
if(vis[now]) continue;
vis[now]=1;
for(int i=head[now];i;i=e[i].next){
if(!vis[e[i].to]&&dis[e[i].to]>e[i].w){
dis[e[i].to]=e[i].w;
pq.push(make_pair(dis[e[i].to],e[i].to));
}
}
}return ;
}
int main(){
cin>>n>>m;
int x,y,z;
while(m--){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}prim();
int ans=0;
for(int i=1;i<=n;i++) ans+=dis[i];
cout<<ans;
return 0;
}