1 #include <bits/stdc++.h>
2 typedef long long LL;
3 using namespace std;
4 const int maxn = 2e5+5;
5
6 struct node{
7 LL u,v,w;
8 node(){}
9 node(LL a,LL b,LL c):u(a),v(b),w(c){}
10 };
11
12 LL f[maxn];
13 LL n,m;
14 vector<node>edge;
15 int Find(LL x)
16 {
17 if (f[x] != x)
18 f[x] = Find(f[x]);
19 return f[x];
20 }
21
22 void Union(LL a, LL b)
23 {
24 int a1 = Find(a);
25 int b1 = Find(b);
26 if (a1 != b1)
27 f[a1] = b1;
28 }
29 bool cmp1(node a,node b)
30 {
31 return a.w>b.w;
32 }
33 bool cmp2(node a,node b)
34 {
35 return a.w<b.w;
36 }
37 int main()
38 {
39 ios::sync_with_stdio(false);
40 cin>>n>>m;
41 for(int i=1;i<=n;i++)
42 f[i]=i;
43 for(int i=0;i<m;i++){
44 LL a,b,c;
45 cin>>a>>b>>c;
46 edge.push_back(node(a,b,c));
47 }
48 sort(edge.begin(),edge.end(),cmp2);
49 LL k=0,max_num=-1;
50 for(int i=0;i<m;i++)
51 {
52 if(Find(edge[i].u)!=Find(edge[i].v))
53 {
54 Union(edge[i].u,edge[i].v);
55 max_num = max(max_num,edge[i].w);
56 k++;
57 }
58 if(k==(n-1))
59 break;
60 }
61 sort(edge.begin(),edge.end(),cmp1);
62 for(int i=1;i<=m;i++)
63 f[i]=i;
64 LL ans=0;
65 k=0;
66 for(int i=0;i<m;i++)
67 {
68 if(edge[i].w>max_num)continue;
69 if(Find(edge[i].u)!=Find(edge[i].v))
70 {
71 Union(edge[i].u,edge[i].v);
72 ans += edge[i].w;
73 k++;
74 }
75 if(k==(n-1))
76 break;
77 }
78 cout<<ans<<endl;
79 return 0;
80 }