#include<bits/stdc++.h>
using namespace std;
const int maxm=4e5+10;
const int maxn=2e5+10;
struct node{
int u,v,w;
bool operator < (const node & o) const{
return w<o.w;
}
} edge[maxm];
int fa[maxm],rk[maxm];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(long long x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
void Init(int n){
for(int i=1;i<=n;i++){
rk[i]=1;
fa[i]=i;
}
}
int find(int x){
if(fa[x]!=x){
fa[x]=find(fa[x]);
}
return fa[x];
}
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
if(rk[x]<rk[y]){
fa[x]=y;
rk[y]+=rk[x];
}else{
fa[y]=x;
rk[x]+=rk[y];
}
}
int Kruskal(int n,int m){
int nEdge=0,length=0;
for(int i=1;i<=m && nEdge!=m-1;i++){
if(find(edge[i].u)==find(edge[i].v)){
continue;
}else{
unite(edge[i].u,edge[i].v);
length+=edge[i].w;
nEdge++;
}
}
if(nEdge<n-1) length=-1;
return length;
}
int main(){
int n,m;n=read();m=read();
Init(n);
for(int i=1;i<=m;i++){
edge[i].u=read();
edge[i].v=read();
edge[i].w=read();
}
sort(edge+1,edge+m+1);
write(Kruskal(n,m));
putchar('\n');
system("pause");
return 0;
}