#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct edge
{
int src;
int dest;
int wt;
edge(int a,int b,int c)
{
src = a;dest = b; wt = c;
}
};
bool compare(edge *a,edge *b)
{
if(a->wt <= b->wt)
return true;
return false;
}
int find(vector<int> &parent,int a)
{
if(parent[a]==-1)
return a;
return find(parent,parent[a]);
}
void Union(vector<int> &parent,int a,int b)
{
int as = find(parent,a);
int bs = find(parent,b);
parent[as]=bs;
}
bool iscycle(edge *a,vector<int> &parent)
{
int ax = find(parent,a->src);
int bx = find(parent,a->dest);
if(ax==bx)
return true;
else
{
Union(parent,ax,bx);
return false;
}
}
int solve(int A, vector<vector<int> > &B) {
edge **arr = new edge*[B.size()];
for(int i=0;i<B.size();i++)
{
arr[i] = new edge(B[i][0],B[i][1],B[i][2]);
}
sort(arr,arr+B.size(),compare);
/*for(int i=0;i<B.size();i++)
cout<<arr[i]->src<<" "<<arr[i]->dest<<" "<<arr[i]->wt<<endl;*/
int ed = 0;
int ans = 0;
vector<int> parent;
parent.resize(A,-1);
/*for(int i=0;i<A;i++)
cout<<parent[i]<<" ";
cout<<endl;*/
for(int i=0;i<B.size();i++)
{
if(iscycle(arr[i],parent)==false)
{
ans += arr[i]->wt;
ed++;
}
if(ed==A-1)
return ans;
}
}
int main()
{
int v,e;
cin>>v>>e;
vector<vector<int> > B;
B.resize(e);
for(int i=0;i<e;i++)
B[i].resize(3);
for(int i=0;i<e;i++)
{
int a,b,wt;
cin>>a>>b>>wt;
B[i][0]=a;
B[i][1]=b;
B[i][2]=wt;
}
/*for(int i=0;i<e;i++)
{
//int a,b,wt;
//cin>>a>>b>>wt;
cout<<B[i][0]<<" "<<B[i][1]<<" "<<B[i][2]<<endl;
}*/
cout<<solve(v,B)<<endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGVkZ2UKewogICAgaW50IHNyYzsKICAgIGludCBkZXN0OwogICAgaW50IHd0OwogICAgZWRnZShpbnQgYSxpbnQgYixpbnQgYykKICAgIHsKICAgICAgICBzcmMgPSBhO2Rlc3QgPSBiOyB3dCA9IGM7CiAgICB9Cn07CmJvb2wgY29tcGFyZShlZGdlICphLGVkZ2UgKmIpCnsKICAgIGlmKGEtPnd0IDw9IGItPnd0KQogICAgICAgIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwp9CmludCBmaW5kKHZlY3RvcjxpbnQ+ICZwYXJlbnQsaW50IGEpCnsKICAgIGlmKHBhcmVudFthXT09LTEpCiAgICAgICAgcmV0dXJuIGE7CiAgICByZXR1cm4gZmluZChwYXJlbnQscGFyZW50W2FdKTsKfQp2b2lkIFVuaW9uKHZlY3RvcjxpbnQ+ICZwYXJlbnQsaW50IGEsaW50IGIpCnsKICAgIGludCBhcyA9IGZpbmQocGFyZW50LGEpOwogICAgaW50IGJzID0gZmluZChwYXJlbnQsYik7CiAgICBwYXJlbnRbYXNdPWJzOwp9CmJvb2wgaXNjeWNsZShlZGdlICphLHZlY3RvcjxpbnQ+ICZwYXJlbnQpCnsKICAgIGludCBheCA9IGZpbmQocGFyZW50LGEtPnNyYyk7CiAgICBpbnQgYnggPSBmaW5kKHBhcmVudCxhLT5kZXN0KTsKICAgIGlmKGF4PT1ieCkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIGVsc2UKICAgIHsKICAgICAgICBVbmlvbihwYXJlbnQsYXgsYngpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQppbnQgc29sdmUoaW50IEEsIHZlY3Rvcjx2ZWN0b3I8aW50PiA+ICZCKSB7CiAgICBlZGdlICoqYXJyID0gbmV3IGVkZ2UqW0Iuc2l6ZSgpXTsKICAgIGZvcihpbnQgaT0wO2k8Qi5zaXplKCk7aSsrKQogICAgewogICAgICAgIGFycltpXSA9IG5ldyBlZGdlKEJbaV1bMF0sQltpXVsxXSxCW2ldWzJdKTsKICAgIH0KICAgIAogICAgc29ydChhcnIsYXJyK0Iuc2l6ZSgpLGNvbXBhcmUpOwogICAgLypmb3IoaW50IGk9MDtpPEIuc2l6ZSgpO2krKykKICAgIAljb3V0PDxhcnJbaV0tPnNyYzw8IiAiPDxhcnJbaV0tPmRlc3Q8PCIgIjw8YXJyW2ldLT53dDw8ZW5kbDsqLwogICAgaW50IGVkID0gMDsKICAgIGludCBhbnMgPSAwOwogICAgdmVjdG9yPGludD4gcGFyZW50OwogICAgcGFyZW50LnJlc2l6ZShBLC0xKTsKICAgIC8qZm9yKGludCBpPTA7aTxBO2krKykKICAgIAljb3V0PDxwYXJlbnRbaV08PCIgIjsKICAgIGNvdXQ8PGVuZGw7Ki8KICAgIGZvcihpbnQgaT0wO2k8Qi5zaXplKCk7aSsrKQogICAgewogICAgICAgIGlmKGlzY3ljbGUoYXJyW2ldLHBhcmVudCk9PWZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgYW5zICs9IGFycltpXS0+d3Q7CiAgICAgICAgICAgIGVkKys7CiAgICAgICAgfQogICAgICAgIGlmKGVkPT1BLTEpCiAgICAgICAgICAgIHJldHVybiBhbnM7CiAgICB9Cn0KaW50IG1haW4oKQp7CglpbnQgdixlOwoJY2luPj52Pj5lOwoJdmVjdG9yPHZlY3RvcjxpbnQ+ID4gQjsKCUIucmVzaXplKGUpOwoJZm9yKGludCBpPTA7aTxlO2krKykKCQlCW2ldLnJlc2l6ZSgzKTsKCWZvcihpbnQgaT0wO2k8ZTtpKyspCgl7CgkJaW50IGEsYix3dDsKCQljaW4+PmE+PmI+Pnd0OwoJCUJbaV1bMF09YTsKCQlCW2ldWzFdPWI7CgkJQltpXVsyXT13dDsKCX0KCS8qZm9yKGludCBpPTA7aTxlO2krKykKCXsKCQkvL2ludCBhLGIsd3Q7CgkJLy9jaW4+PmE+PmI+Pnd0OwoJCWNvdXQ8PEJbaV1bMF08PCIgIjw8QltpXVsxXTw8IiAiPDxCW2ldWzJdPDxlbmRsOwoJfSovCgljb3V0PDxzb2x2ZSh2LEIpPDxlbmRsOwp9Cg==