#include<bits/stdc++.h>
using namespace std;
struct edge {
int u, v;
int w;
};
const int maxn = 1001;
int n,m;
int parent[maxn], sz[maxn];
vector<edge> canh;
void make_set(){
for(int i = 1; i <= n ; i++){
parent[i] = i;
sz[i] = 1;
}
}
int find(int v){
if(v == parent[v]) return v;
return parent[v] = find(parent[v]);
}
bool Union(int a,int b){
a = find(a);
b = find(b);
if(a == b) return false;
if(sz[a] < sz[b]) swap(a,b);
parent[b] = a;
sz[a] + sz[b];
return true;
}
void inp(){
cin >> n >> m ;
for(int i = 0 ; i < m ; i++){
int x,y,w;
cin >> x >> y >> w;
edge e;
e.u = x;
e.v = y;
e.w = w;
canh.push_back(e);
}
}
bool cmp(edge a, edge b){
return a.w < b.w;
}
void kruskal(){
// Tạo cây khung cực tiểu rỗng
vector<edge> mst;
int d = 0 ;
// Sort danh sách cạnh theo chiều dài tăng dần
sort(canh.begin() , canh.end(),cmp);
// BƯớc 3 : Lặp;
for(int i = 0 ; i < m ; i++){
if(mst.size() == n - 1) break;
edge e = canh[i]; // Chọn cạnh e là cạnh nhỏ nhất
if(Union(e.u,e.v)){
mst.push_back(e);
d +=e.w;
}
}
// Trả về kết quả
if(mst.size() != n - 1){
cout << "Đồ thị không liên thông !\n";
}
else{
cout << "MST : " << d << endl;
for(auto it : mst){
cout << it.u << " " << it.v << " " << it.w << endl;
}
}
}
int main(){
inp();
make_set();
kruskal();
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IGVkZ2UgewogICAgaW50IHUsIHY7CiAgICBpbnQgdzsKfTsKY29uc3QgaW50IG1heG4gPSAxMDAxOwppbnQgbixtOwppbnQgcGFyZW50W21heG5dLCBzelttYXhuXTsKdmVjdG9yPGVkZ2U+IGNhbmg7CnZvaWQgbWFrZV9zZXQoKXsKICAgIGZvcihpbnQgaSA9IDE7ICBpIDw9IG4gOyBpKyspewogICAgICAgIHBhcmVudFtpXSA9IGk7CiAgICAgICAgc3pbaV0gPSAxOwogICAgfQp9CgppbnQgZmluZChpbnQgdil7CiAgICBpZih2ID09IHBhcmVudFt2XSkgcmV0dXJuIHY7CiAgICByZXR1cm4gcGFyZW50W3ZdID0gZmluZChwYXJlbnRbdl0pOwp9Cgpib29sIFVuaW9uKGludCBhLGludCBiKXsKICAgIGEgPSBmaW5kKGEpOwogICAgYiA9IGZpbmQoYik7CiAgICBpZihhID09IGIpIHJldHVybiBmYWxzZTsKICAgIGlmKHN6W2FdIDwgc3pbYl0pIHN3YXAoYSxiKTsKICAgIHBhcmVudFtiXSA9IGE7CiAgICBzelthXSArIHN6W2JdOwogICAgcmV0dXJuIHRydWU7Cn0Kdm9pZCBpbnAoKXsKICAgIGNpbiA+PiBuID4+IG0gOwogICAgZm9yKGludCBpID0gMCA7IGkgPCBtIDsgaSsrKXsKICAgICAgICBpbnQgeCx5LHc7CiAgICAgICAgY2luID4+IHggPj4geSA+PiB3OwogICAgICAgIGVkZ2UgZTsKICAgICAgICBlLnUgPSB4OwogICAgICAgIGUudiA9IHk7CiAgICAgICAgZS53ID0gdzsKICAgICAgICBjYW5oLnB1c2hfYmFjayhlKTsKICAgIH0KfQpib29sIGNtcChlZGdlIGEsIGVkZ2UgYil7CiAgICByZXR1cm4gYS53IDwgYi53Owp9CnZvaWQga3J1c2thbCgpewogICAgLy8gVOG6oW8gY8OieSBraHVuZyBj4buxYyB0aeG7g3UgcuG7l25nCiAgICB2ZWN0b3I8ZWRnZT4gbXN0OwogICAgaW50IGQgPSAwIDsKICAgIC8vIFNvcnQgZGFuaCBzw6FjaCBj4bqhbmggdGhlbyBjaGnhu4F1IGTDoGkgdMSDbmcgZOG6p24KICAgIHNvcnQoY2FuaC5iZWdpbigpICwgY2FuaC5lbmQoKSxjbXApOwogICAgLy8gQsav4bubYyAzIDogTOG6t3A7CiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IG0gOyBpKyspewogICAgICAgIGlmKG1zdC5zaXplKCkgPT0gbiAtIDEpIGJyZWFrOwogICAgICAgIGVkZ2UgZSA9IGNhbmhbaV07IC8vIENo4buNbiBj4bqhbmggZSBsw6AgY+G6oW5oIG5o4buPIG5o4bqldAogICAgICAgIGlmKFVuaW9uKGUudSxlLnYpKXsKICAgICAgICAgICAgbXN0LnB1c2hfYmFjayhlKTsKICAgICAgICAgICAgZCArPWUudzsKICAgICAgICB9CiAgICB9CiAgICAvLyBUcuG6oyB24buBIGvhur90IHF14bqjCiAgICBpZihtc3Quc2l6ZSgpICE9IG4gLSAxKXsKICAgICAgICBjb3V0IDw8ICLEkOG7kyB0aOG7iyBraMO0bmcgbGnDqm4gdGjDtG5nICFcbiI7CiAgICB9CiAgICBlbHNlewogICAgICAgIGNvdXQgPDwgIk1TVCA6ICIgPDwgZCA8PCBlbmRsOwogICAgICAgIGZvcihhdXRvIGl0IDogbXN0KXsKICAgICAgICAgICAgY291dCA8PCBpdC51IDw8ICIgIiA8PCBpdC52IDw8ICIgIiA8PCBpdC53IDw8IGVuZGw7CiAgICAgICAgfQogICAgfQp9CmludCBtYWluKCl7CiAgICBpbnAoKTsKICAgIG1ha2Vfc2V0KCk7CiAgICBrcnVza2FsKCk7Cn0K