#include <stdio.h>
#include <vector>
#include <algorithm>
struct Link {
int nodeA;
int nodeB;
int len;
};
bool comparathor(Link const & a, Link const & b)
{
return a.len < b.len;
}
Link maxlink;
int linkcount;
int nodecount;
int * nodes;
int components;
std::vector<Link> links;
long long fullSize;
int component(int node)
{
if (*(nodes + node) == node)
return node;
else
{
int cmp = component(*(nodes + node));
*(nodes + node) = cmp;
return cmp;
}
}
void setComponent(int node, int component)
{
if (*(nodes + node) == node)
*(nodes + node) = component;
else
{
setComponent(*(nodes + node),component);
*(nodes + node) = component;
}
}
int main (int argc, char * argv[])
{
nodes = 0;
// full run
while (scanf("%d %d",&nodecount,&linkcount)==2)
{
// init
maxlink.len = 0;
components = nodecount;
links.clear();
delete[] nodes;
nodes = new int[nodecount];
for (int i(0);i<nodecount;++i)
*(nodes+i) = i;
fullSize = 0;
// links reading
Link curLink;
for (int i (0);i<linkcount;++i)
{
scanf("%d %d %d",&curLink.nodeA,&curLink.nodeB,&curLink.len);
--curLink.nodeA;
--curLink.nodeB;
if (curLink.len > maxlink.len)
maxlink = curLink;
links.push_back(curLink);
}
// SORT LINKS HERE
sort(links.begin(),links.end(),comparathor);
// implicitly use maxlink
*(nodes+maxlink.nodeA) = *(nodes+maxlink.nodeB);
--components;
// find minimal kostra
for (std::vector<Link>::const_iterator pnter(links.begin());pnter!=links.end();++pnter)
{
if (component(pnter->nodeA) != component(pnter->nodeB))
{
fullSize += pnter->len;
setComponent(pnter->nodeA,*(nodes + pnter->nodeB));
--components;
}
}
fullSize -= maxlink.len;
if (components > 1)
printf("disconnected\n");
else
printf("%lld\n",fullSize);
}
}