#include<iostream>
#include<cstring>
const int N = 510, INF=0x3f3f3f3f;
int n,m;
int g[N][N];
// 表示各个点到集合的距离
int dist[N];
// 表示集合s
bool st[N];
using namespace std;
int prim()
{
memset(dist,0x3f,sizeof dist);
// 最小生成树边权之和
int res=0;
for(int i=0;i<n;i++)
{
// t表示距离集合s最近的点
int t=-1;
for(int j=1;j<=n;j++)
{
if(!st[j] && (t==-1||dist[t]>dist[j]))
{
t = j;
}
}
// 不可能存在最小生成树
if(i && dist[t]==INF) return INF;//i==0:第一个点选中,没有边
if(i) res += dist[t];
// 更新
for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
st[t]=true;
}
return res;
}
int main() {
cin>>n>>m;
memset(g,0x3f,sizeof g);
for(int i=0;i<m;i++) {
int a,b,c; cin>>a>>b>>c;
// 处理重边
g[a][b]=g[b][a]=min(g[a][b],c);
}
int t = prim();
if(t==INF) puts("impossible");
else cout<<t<<endl;
return 0;
}