//并查集---路径压缩(非递归版)--ref算法笔记
//边贪心思想
//用树的性质V-1==E控制循环提前跳出break
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
const int M=1000010;
struct edge{
int u;int v;
int w;
};
edge E[M];
int n,m;
int father[N];
void ufs_init(int n){
for(int i=1;i<=n;i++){
father[i]=i;
}
}
int finddad(int x){
int a=x;
while(x!=father[x]){
x=father[x];
}
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
bool cmp(edge a,edge b){
return a.w<b.w;
}
int Kruskal(int n,int m){
ufs_init(n);
int ans=0;int Num_edge=0;
sort(E,E+m,cmp);
for(int i=0;i<m;i++){
int u=E[i].u;
int v=E[i].v;
int w=E[i].w;
int fu=finddad(u);
int fv=finddad(v);
if(fu!=fv){
father[fu]=fv;
ans+=w;
Num_edge++;
if(Num_edge == n-1) break;
}
}
if(Num_edge != n-1) return -1;
else return ans;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<m;i++){
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
}
int ans=Kruskal(n,m);
printf("%d\n",ans);
}
return 0;
}