#include<iostream>#include<algorithm>#defineINF0x3f3f3f3fusingnamespace std;constint N =2e5+5;typedefstructedge{int v;int nv;int w;//权值}edge;
edge e[N];//边集int n, m;int bcj[N];//并查集boolcmp(edge a, edge b){return a.w < b.w;//按权值从小到大排序}intfind(int x){if(bcj[x]!= x)return bcj[x]=find(bcj[x]);return bcj[x];}voidkruskal(){int num =0;int ans =0;//从权值最小开始依次遍历每条边for(int i =0; i < m; i++){int x = e[i].v;int y = e[i].nv;int fx =find(bcj[x]);int fy =find(bcj[y]);//当前边连接的两个结点不在同一个集合中//则选中该边作为生成树的边//由于是从权值小到大选,最后的生成树权值之和一定最小if(fx != fy){
ans += e[i].w;
bcj[fy]= fx;
num++;}if(num == n-1)break;}//n个结点需要n-1条边构成最小生成树if(num < n-1)printf("impossible");//找不到n-1条边elseprintf("%d", ans);//输出最小权值和}intmain(){scanf("%d%d",&n,&m);for(int i =0; i <= n; i++)
bcj[i]= i;for(int i =0; i < m; i++){scanf("%d%d%d",&e[i].v,&e[i].nv,&e[i].w);}sort(e, e + m, cmp);kruskal();return0;}