#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define infinity 0xffffff
//并查集的实现 --》进行合并--遵循的原则:靠左原则、擒贼先擒王
typedef struct LNode{
int p1,p2,weight;
}LNode;
void init(int *f,int n){
for(int i=1;i<=n;i++)
f[i]=i;
}
int getf(int *f,int a){
if(f[a]==a) return a;
else {
//路径压缩 缩短时间
f[a]=getf(f,f[a]);
return f[a];
}
}
int merg(int *f,int a,int b){
int boss1,boss2;
boss1=getf(f,a);
boss2=getf(f,b);//擒贼先擒王
if(boss1!=boss2){
//靠左原则
f[boss2]=boss1;
return 1;
}
return 0;
}
void quicksort(LNode *e,int left,int right){
if(left>right) return ;
int i=left,j=right;
while(i!=j){
while(e[j].weight>=e[left].weight&&i<j) j--;
while(e[i].weight<=e[left].weight&&i<j) i++;
if(i<j){
LNode temp=e[i];
e[i]=e[j];
e[j]=temp;
}
}
LNode temp=e[i];
e[i]=e[left];
e[left]=temp;
quicksort(e,left,i-1);
quicksort(e,i+1,right);
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
int *f=(int *)malloc(sizeof(int)*(n+1));
init(f,n);
LNode *e=(LNode *)malloc(sizeof(LNode)*m);
for(int i=0;i<m;i++){
scanf("%d %d %d",&e[i].p1,&e[i].p2,&e[i].weight);
}
quicksort(e,0,m-1);
int coun=0,sum=0;
for(int i=0;i<m;i++){
if(merg(f,e[i].p1,e[i].p2)){
coun++;
sum+=e[i].weight;
}
if(coun==n-1) break;
}
if(coun!=n-1) printf("-1\n");
else printf("%d\n",sum);
return 0;
}