#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define PI 3.14159
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
const int MAX_INT = 0x3f3f3f3f;
const int N = 1e6+15;
const int mod = 1e9+7;
int n,m;
int f[N];
struct Edge{
int u,v,w;
};
Edge edge[N];
//结构体排序采用这种方式,清晰,小的在前面;
bool cmp(Edge e1,Edge e2)
{
return e1.w<e2.w;//从小到大排序
}
int find_root(int x)// 并查集
{
if(f[x]!=x)
f[x]=find_root(f[x]);
return f[x];
}
int res=0;
int node=0;
void krusal()
{
sort(edge,edge+m,cmp);//结构体排序,自己写一下cmp
for(int i=1;i<=n;i++)
f[i]=i;
//kruskal算法:从最小的边开始画,直到把整个图画通。
for(int i=0;i<m;i++)
{
int u=edge[i].u;
int v=edge[i].v;
int w=edge[i].w;
int fu = find_root(u);
int fv = find_root(v);
if(fu!=fv)
{
f[fu]=fv;
res+=w;
node++;
}
}
}
void solve()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
edge[i]={a,b,c};
}
krusal();
if(node!=n-1)
cout<<"impossible"<<endl;
else
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T = 1;
while(T--)
{
solve();
}
}