/* Name: 最小生成树(kruskal) Copyright: Author: Try86 Date: 15/04/12 08:01 Description: */ #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; const int N = 10005; const int M = 50005; int p[N], sum; struct edge { int u; int v; int w; }e[M]; int cmp(const void *a, const void *b) { return (*(edge *)a).w - (*(edge *)b).w; } void init(int vs) { for (int i=1; i<=vs; ++i) p[i] = i; return ; } int find(int v) { if (p[v] != v) p[v] = find(p[v]); return p[v]; } int join(edge e) { int x, y; x = find(e.u); y = find(e.v); if (x != y) { ++sum; p[x] = y; return e.w; } return 0; } int kruskal(int es, int vs) { int ans = 0; init(vs); qsort(e, es, sizeof(edge), cmp); sum = 1; for (int i=0; i<es; ++i) { ans += join(e[i]); if (sum == vs) return ans; } return -1; } int main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) { for (int i=0; i<m; ++i) scanf ("%d%d%d", &e[i].u, &e[i].v, &e[i].w); int ans = kruskal(m, n); printf ("%d\n", ans); } return 0; }