#include "stdio.h"
#include "stdlib.h"
#define maxe 5003
#define maxst 200005
#define INF 200000000
typedef enum Bool{
True = 1,
False = 0
}bool;
struct edge{
int v;
int w;
int next;
}e[maxst];
int n, m, cnt, pre[maxe];
long ans;
bool vis[maxe];
void add_edge(int u, int v, int w){
e[++cnt].v = v;
e[cnt].w = w;
e[cnt].next = pre[u];
pre[u] = cnt;
}
void init(){
int u, v, w;
scanf("%d%d", &n, &m);
for (int sta = 1; sta <= m; sta++){
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w);
add_edge(v, u, w);
}
}
void build_tree_of_least_edgew(){
vis[1] = 1;
int dis[maxe];
int j = pre[1], tot, now = 1, now_dis;
for (int i = 1; i <= n; i++) dis[i] = INF;
while (j){
if (e[j].w < dis[e[j].v]) dis[e[j].v] = e[j].w;
j = e[j].next;
}
while(++tot < n){
now_dis = INF;
for(int i = 1; i <= n; i++){
if (!vis[i]&&dis[i] <= now_dis) { now_dis = dis[i]; now = i; }
}
vis[now] = 1; ans+= now_dis;
j = pre[now];
while (j){
if (e[j].w < dis[e[j].v]) dis[e[j].v] = e[j].w;
j = e[j].next;
}
}
}
int main() {
init();
build_tree_of_least_edgew();
bool All = 1;
for (int k = 1; k <= n; k++) if (!vis[k]) All = 0;
if(All==1) printf("%ld\n", ans);
else printf("orz");
return 0;
}