#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<queue>
#define MAXN 1005
using namespace std;
int root[MAXN];
struct edge{
int head;
int tail;
int cost;
friend bool operator< (const edge &e1,const edge &e2){
return e1.cost > e2.cost;
}
};
priority_queue<edge> qn;
int findroot(int index){
if(root[index] == -1)
return index;
else
return root[index] = findroot(root[index]);
}
int kruskal(){
int count;
edge ebuf;
count=0;
while(!qn.empty()){
ebuf = qn.top();
qn.pop();
int bufroot1 = findroot(ebuf.head);
int bufroot2 = findroot(ebuf.tail);
if(bufroot1 != bufroot2){
root[bufroot1] = bufroot2;
count+=ebuf.cost;
}
}
return count;
}
int main(){
int i;
int n;
int m;
int u,v,cost,complete;
edge edgebuf;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
root[i]=-1;
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d %d %d",&u,&v,&cost);
edgebuf.head = u;
edgebuf.tail = v;
edgebuf.cost = cost;
qn.push(edgebuf);
}
int costbuf = kruskal();
int count;
count=0;
for(i=0;i<n;i++){
if(root[i] == -1)
count++;
}
if(count == 1)
printf("%d\n\n",costbuf);
else
printf("impossible\n\n");
}
return 0;
}