#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<cmath>#include<cstring>#include<string>#include<vector>#include<set>#include<stack>#include<list>#include<map>#define INF 0x3f3f3f3f#define MID l + r >> 1#define lsn rt << 1#define rsn rt << 1 | 1#define Lson lsn, l, mid#define Rson rsn, mid+1, r#define QL Lson, ql, qr#define QR Rson, ql, qr
using namespace std;typedeflonglong ll;constint maxN =1e3+5;constint maxM =2e4+5;int N, M;struct node{int u, w, s;node(int a =0,int b =0,int c =0):u(a),w(b),s(c){}
friend bool operator <(node n1, node n2){return n1.s > n2.s ;}}ve[maxM];int root[maxN], size[maxN], high[maxN];voidinit(){for(int i =1; i <= N ; i ++){
root[i]= i;
size[i]=1;
high[i]=0;}}intFind(int x){return root[x]== x ? x : root[x]=Find(root[x]);}intSame(int x,int y){returnFind(x)==Find(y);}voidMerge(int x,int y){
x =Find(x); y =Find(y);if(high[x]< high[y]|| size[x]< size[y]){
root[x]= y;
size[y]+= size[x];}else{
root[y]= x;
size[x]+= size[y];if(high[x]== high[y]) high[x]++;}}intKruskal(){int ans =0, edge_num =0;sort(ve, ve + M);for(int i =0; i < M ; i ++){if(!Same(ve[i].u, ve[i].w)){Merge(ve[i].u, ve[i].w);
ans += ve[i].s;
edge_num ++;}if(edge_num == N -1)return ans;}return-1;}intmain(){while(~scanf("%d%d",&N,&M)){init();for(int i =0; i < M; i ++)scanf("%d%d%d",&ve[i].u,&ve[i].w,&ve[i].s);printf("%d\n",Kruskal());}return0;}