1 var
2 d,place,a:array[1..10000] of longint;
3 now,MST,heapsize,i,n,x1,x2,x3,m:integer;
4 done:array[1..10000] of boolean;
5 e:array[1..10000,1..10000] of integer;
6 procedure exchange(x,y:integer);
7 var
8 temp:integer;
9 begin
10 place[a[x]]:=y;
11 place[a[y]]:=x;
12 temp:=a[x];a[x]:=a[y];a[y]:=temp;
13 end;
14 procedure min_heapify(i:integer);
15 var
16 l,r,smaller:integer;
17 begin
18 l:=i shl 1;
19 r:=l+1;
20 smaller:=i;
21 if (d[a[l]]<d[a[smaller]])and(l<=heapsize) then smaller:=l;
22 if (d[a[r]]<d[a[smaller]])and(r<=heapsize) then smaller:=r;
23 if smaller<>i then
24 begin
25 exchange(smaller,i);
26 min_heapify(smaller);
27 end;
28 end;
29 function extract_min:integer;
30 begin
31 extract_min:=a[1];
32 a[1]:=a[heapsize];
33 place[a[1]]:=1;
34 dec(heapsize);
35 min_heapify(1);
36 end;
37
38 procedure change(k,x:integer);
39 var
40 i:integer;
41 begin
42 i:=k;
43 while (i>1)and(d[a[i shr 1]]>x) do
44 begin
45 exchange(i,i shr 1);
46 i:=i shr 1;
47 end;
48
49 end;
50 begin
51 assign(input,'mst.in');
52 reset(input);
53 readln(n,m);
54 for i:=1 to m do
55 begin
56 readln(x1,x2,x3);
57 e[x1,x2]:=x3;
58 e[x2,x1]:=x3;
59 end;
60 fillchar(done,sizeof(done),false);
61 for i:=1 to n do d[i]:=maxlongint;
62 d[1]:=0;
63 for i:=1 to n do a[i]:=i;
64 for i:=1 to n do place[i]:=i;
65 heapsize:=n;
66 while heapsize<>0 do
67 begin
68 now:=extract_min;
69 done[now]:=true;
70 for i:=1 to n do if not(done[i])and(e[i,now]<d[i])and(e[i,now]<>0) then
71 begin
72 d[i]:=e[i,now];
73 change(place[i],e[i,now]);
74 end;
75 MST:=MST+d[now];
76 end;
77 writeln(mst);
78 close(input);
79 end.