#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 510,INF = 0x3f3f3f3f;
int n,m;
int g[N][N]; // a~b的距离
int dist[N]; // t 到集合的距离
bool st[N]; // t 是否在集合中
// 这个算法和dijkstra()算法代码很相似
int prim()
{
memset(dist,0x3f,sizeof dist); // 初始化,开始的时候集合为INF
int res = 0; // 每个点到集合的距离的最小值之和
for(int i = 0; i < n;i++)
{
int t = -1; // 令 t = -1
// 查找在集合外,且距离集和最近的点
for(int j = 1; j <=n;j++)
if(!st[j]&&(t==-1||dist[t]>dist[j]))t = j;
// 如果没有,则 return INF;
if(i&&dist[t]==INF)return INF;
if(i)res+=dist[t];
// 表示t 已经被加入到集合中了
st[t] = true;
// 用新加入的点更新其余点到生成树的最短边
for(int j = 1;j<=n;j++)dist[j] = min(dist[j],g[t][j]);
}
return res;
}
int main()
{
cin >> n >>m;
memset(g,0x3f,sizeof g);
while(m--)
{
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
printf("%d\n",t);
return 0;
}