#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef long long int int64;

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))

int root(int *u,int x){
  if(u[x]==x) return x;
  return u[x]=root(u,u[x]);
}

int same(int *u,int x,int y){
  return root(u,x)==root(u,y);
}

void unite(int *u,int x,int y){
  x=root(u,x);
  y=root(u,y);
  if(x==y) return;
  u[x]=y;
  return;
}

typedef struct weightEdge{
  int s,t;
  int w;
} edge;

int cmp(const void *a,const void *b){
  return ((edge *)a)->w-((edge *)b)->w;
}

void run(void){
  int v,e;
  scanf("%d%d",&v,&e);
  edge *array=(edge *)malloc(sizeof(edge)*e);
  int i;
  for(i=0;i<e;i++){
    int s,t,w;
    scanf("%d%d%d",&s,&t,&w);
    array[i].s=s;
    array[i].t=t;
    array[i].w=w;
  }
  qsort(array,e,sizeof(edge),cmp);
  int *u=(int *)malloc(sizeof(int)*v);
  for(i=0;i<v;i++) u[i]=i;
  int ans=0;
  int cnt=0;
  for(i=0;cnt<v-1;i++){
    if(same(u,array[i].s,array[i].t)) continue;
    unite(u,array[i].s,array[i].t);
    ans+=array[i].w;
    cnt++;
  }
  printf("%d\n",ans);
  free(array);
  free(u);
  return;
}

int main(void){
  run();
  return 0;
}

