#include<cstring>#include<iostream>#include<algorithm>usingnamespace std;constint N =100010, M =200010, INF =0x3f3f3f3f;int n, m;int p[N];structEdge{int a, b, w;booloperator<(const Edge &W)const{return w < W.w;}}edges[M];intfind(int x){if(p[x]!= x) p[x]=find(p[x]);return p[x];}intkruskal(){sort(edges, edges + m);for(int i =1; i <= n; i ++) p[i]= i;// 初始化并查集int res =0, cnt =0;for(int i =0; i < m; i ++){int a = edges[i].a, b = edges[i].b, w = edges[i].w;
a =find(a), b =find(b);if(a != b){
p[a]= b;
res += w;
cnt ++;}}if(cnt < n -1)return INF;return res;}intmain(){scanf("%d%d",&n,&m);for(int i =0; i < m; i ++){int a, b, w;scanf("%d%d%d",&a,&b,&w);
edges[i]={a, b, w};}int t =kruskal();if(t == INF)puts("impossible");elseprintf("%d\n", t);return0;}