/* Função principal. */ int main(void) { int n, m; /* Para cada caso de teste. */ while(scanf("%d %d", &n, &m), n || m) { /* Limpando o meu vector. */ edges.clear(); ds.clear(n); /* Lendo cada aresta. */ for (int i = 0; i < m; i++) { int v, u, weight; scanf("%d %d %d", &v, &u, &weight); edges.push_back(make_pair(weight, make_pair(v, u))); } /* Ordenando as arestas pelo peso. */ sort(edges.begin(), edges.end()); /* Kruskal, propriamente dito. */ bool first = true; int economy = 0; for (int i = 0; i < m; i++) { /* Se os vértices têm representantes diferents, então eles estão em árvores diferentes e podem ser ligados por uma aresta sem gerar ciclo. */ if (ds.ds_find(edges[i].second.first) != ds.ds_find(edges[i].second.second)) { ds.ds_union(edges[i].second.first, edges[i].second.second); } /* Senão, não. */ else { economy += edges[i].first; } } printf("%d\n", economy); } return 0; }