#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long llu;
const long long int MAX=5e3+100,inf=0x3f3f3f3f,MAXN=1e6;
typedef struct node{
int from,to;
llu dis;
}stick;
stick arr[MAXN];
llu fa[MAXN];
bool cmp(stick x,stick y){
return x.dis<y.dis;
}
int find(int a){
while(a!=fa[a])a=fa[a];
return a;
}
void unionn(int x,int y){
x=find(x);
y=find(y);
fa[x]=y;
}
llu Kruskal(stick*a,int n,int m){
llu num=0;
llu sum=0;
for(int i=1;i<=m;i++){
if(find(a[i].from)!=find(a[i].to)){
sum+=a[i].dis;
num++;
unionn(a[i].from,a[i].to);
}
if(n-1==num){
return sum;
}
}
if(n-1!=num)return -1;
}
int main()
{
int n,m,u,v;
llu w;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
fa[u]=u,fa[v]=v;
arr[i].from=u,arr[i].to=v,arr[i].dis=w;
}
sort(arr+1,arr+1+m,cmp);
llu sum=Kruskal(arr,n,m);
cout<<sum<<endl;
return 0;
}```