#include<bits/stdc++.h>
using namespace std;
int n,m;
int po[1010][1010],vis[1010];
int lowcost[1010];
#define mi 0x3f3f3f
#define inf 0x3f3f3f
void prim()
{
int flag=0,sum=0,k;
vis[1]=1;
for(int i=1;i<=n;i++)
{
lowcost[i]=po[i][1];
}
for(int i=2;i<=n;i++)
{
int Min=mi;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<Min)//找目标点的周围的最小权(未遍历过的)
{
Min=lowcost[j];
k=j;
}
}
if(Min==mi)
{
flag=1;
break;
}
sum+=Min;
vis[k]=1;
for(int j=1;j<=n;j++)//更新一下数组 从数组里面挑出来的最小的就是(未遍历过的)
{
if(!vis[j]&&lowcost[j]>po[j][k])
{
lowcost[j]=po[j][k];
}
}
}
if(!flag)
{
cout<<sum<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
int main()
{
while(cin>>n>>m)
{
int i,w,u,v;
memset(vis,0,sizeof(vis));
memset(po,inf,sizeof(po));
for(i=0;i<m;i++)
{
cin>>u>>v>>w;
po[u][v]=po[v][u]=w;
}
prim();
}
return 0;
}
using namespace std;
int n,m;
int po[1010][1010],vis[1010];
int lowcost[1010];
#define mi 0x3f3f3f
#define inf 0x3f3f3f
void prim()
{
int flag=0,sum=0,k;
vis[1]=1;
for(int i=1;i<=n;i++)
{
lowcost[i]=po[i][1];
}
for(int i=2;i<=n;i++)
{
int Min=mi;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]<Min)//找目标点的周围的最小权(未遍历过的)
{
Min=lowcost[j];
k=j;
}
}
if(Min==mi)
{
flag=1;
break;
}
sum+=Min;
vis[k]=1;
for(int j=1;j<=n;j++)//更新一下数组 从数组里面挑出来的最小的就是(未遍历过的)
{
if(!vis[j]&&lowcost[j]>po[j][k])
{
lowcost[j]=po[j][k];
}
}
}
if(!flag)
{
cout<<sum<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
int main()
{
while(cin>>n>>m)
{
int i,w,u,v;
memset(vis,0,sizeof(vis));
memset(po,inf,sizeof(po));
for(i=0;i<m;i++)
{
cin>>u>>v>>w;
po[u][v]=po[v][u]=w;
}
prim();
}
return 0;
}