#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 110; int p[N]; int height[N]; struct Edge{ int a; int b; int w; bool operator < (const Edge& e) const{ return w < e.w; } Edge(int x,int y,int z): a(x), b(y), w(z) {}; }; void init(int n) { for (int i = 1; i <= n; i++)p[i] = i, height[i] = 0; } int find(int a) { if (a != p[a])p[a] = find(p[a]); return p[a]; } void cUnion(int a, int b) { int x = find(a); int y = find(b); if (x != y) { if (height[x] > height[y]) { p[y] = x; } else if (height[x] < height[y]) { p[x] = y; } else { p[x] = y; height[y] += height[x]; } } } int kruskal(vector<Edge> edges){ int ans=0; for(int i=0;i<edges.size();i++){ int a = edges[i].a; int b = edges[i].b; int w = edges[i].w; if(find(a)==find(b))continue; else{ ans+=w; cUnion(a,b); } } return ans; } int main() { int n; while (cin >> n) { if(!n)break; init(n); int m = n*(n-1)/2; vector<Edge> edges; while (m--) { int a, b, w; cin >> a >> b >>w; edges.push_back(Edge(a,b,w)); } sort(edges.begin(),edges.end()); int ans = kruskal(edges); cout<<ans<<endl; } }