#include #define For(i,l,r) for (register int i=l; i<=r; i++) using namespace std; typedef unsigned long long LL; typedef signed long long ll; template inline void read(T &x) { char c = getchar(); int w = 1; x = 0; while (!isdigit(c)) (c == '-') && (w = -w), c = getchar(); while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ '0'), c = getchar(); x *= w; } const int N = 100010; int n, m, u, v, w, head[N], cnt = 0; bool vis[N]; struct Edge { int to, w, nxt; } edge[N<<1]; inline void add(int u, int v, int val) { edge[++ cnt].to = v; edge[cnt].w = val; edge[cnt].nxt = head[u]; head[u] = cnt; } signed main() { while (cin >> n >> m) { cnt = 0; for (register int i=1; i<=n; ++i) { head[i] = 0; vis[i] = false; } for (register int i=1; i<=m; ++i) { read(u); read(v); read(w); if (u == v) continue; add(u, v, w); add(v, u, w); } queue q; q.push(1); vis[1] = true; while (!q.empty()) { int fr = q.front(); q.pop(); for (register int i=head[fr]; i; i=edge[i].nxt) { int to = edge[i].to; if (!vis[to]) { vis[to] = true; q.push(to); } } } bool flag = true; for (register int i=1; i<=n; ++i) { if (!vis[i]) { flag = false; break; } } if (!flag) { puts("0"); continue; } int ans = 100000000; for (register int i=1; i<=n; ++i) { int res = 0; for (register int j=head[i]; j; j=edge[j].nxt) { res += edge[j].w; } ans = min(ans, res); } printf("%d\n", ans); } getchar(); return 0; }