//
source code of submission 689439, Zhongshan University Online Judge System
#include
<
iostream
>
#include
<
vector
>
#include
<
algorithm
>
using
namespace
std;
struct
Edge
{
int
u,v,length;
Edge(
int
uu,
int
vv,
int
ll): u(uu),v(vv),length(ll) {}
};
vector
<
Edge
>
vec;
int
root[
60
];
int
P,R;
bool
cmp(Edge x,Edge y)
{
return
(x.length
<
y.length);
}
void
makeSet()
{
for
(
int
i
=
0
;i
<=
60
;
++
i) root[i]
=
-
1
;
}
int
findSet(
int
x)
{
while
(root[x]
>=
0
) x
=
root[x];
return
x;
}
void
unionSet(
int
a,
int
b)
{
int
x
=
findSet(a),y
=
findSet(b);
root[x]
=
y;
}
int
main()
{
int
u,v,l,i;
while
(
true
)
{
cin
>>
P;
if
(P
==
0
)
break
;
cin
>>
R;
for
(i
=
0
;i
<
R;
++
i)
{
cin
>>
u
>>
v
>>
l;
vec.push_back(Edge(u,v,l));
}
sort(vec.begin(),vec.end(),cmp);
int
ans
=
0
; makeSet();
for
(i
=
0
;i
<
vec.size();
++
i)
{
int
x
=
findSet(vec[i].u),y
=
findSet(vec[i].v);
if
(x
!=
y)
{
ans
+=
vec[i].length;
unionSet(x,y);
}
}
cout
<<
ans
<<
endl;
vec.clear();
}
return
0
;
}