#include <iostream>
#include <vector>
#include <stack>
#include<algorithm>
#include<string>
#define int long long
using namespace std;
class DSU {
private:
vector<int>parent, rank, sz;
int comp = 0, maxi = 0;
stack < pair<int, pair<int, int>>>history;
stack<int>checkpoint;
public:
DSU(int n) {
parent.resize(n + 1);
rank.resize(n + 1);
sz.assign(n + 1, 1);
comp = n;
maxi = 1;
for (int i = 0; i <= n; i++) parent[i] = i;
}
int find_root(int node) {
if (node == parent[node]) return node;
return find_root(parent[node]);
}
int union_by_rank(int u, int v) {
int root_u = find_root(u), root_v = find_root(v);
if (root_u == root_v) return comp;
comp--;
if (rank[root_u] > rank[root_v]) {
history.push({ 0, {root_v, parent[root_v]} });
parent[root_v] = root_u;
}
else {
history.push({ 0, {root_u, parent[root_u]} });
parent[root_u] = root_v;
if (rank[root_u] == rank[root_v]) {
history.push({ 1, {root_v, rank[root_v]} });
rank[root_v]++;
}
}
return comp;
}
int union_by_size(int u, int v) {
int root_u = find_root(u), root_v = find_root(v);
if (root_u == root_v) return comp;
comp--;
if (sz[root_u] < sz[root_v]) {
history.push({ 0, {root_u, parent[root_u]} });
history.push({ 2, {root_v, sz[root_v]} });
parent[root_u] = root_v;
sz[root_v] += sz[root_u];
}
else {
history.push({ 0, {root_v, parent[root_v]} });
history.push({ 2, {root_u, sz[root_u]} });
parent[root_v] = root_u;
sz[root_u] += sz[root_v];
}
maxi = max({ maxi, sz[root_v], sz[root_u] });
return comp;
}
void presist() {
checkpoint.push(history.size());
}
int rollback() {
if (checkpoint.empty()) return comp;
int check = checkpoint.top();
checkpoint.pop();
while (history.size() > check) {
int type = history.top().first, node = history.top().second.first, last_val = history.top().second.second;
history.pop();
if (type == 0) { // parent
if (parent[node] != node) {
comp++;
}
parent[node] = last_val;
}
else if (type == 1) { // rank
rank[node] = last_val;
}
else{ // size
sz[node] = last_val;
}
}
return comp;
}
int unite(int u, int v) {
return union_by_size(u, v);
}
bool are_connected(int u, int v) {
return find_root(u) == find_root(v);
}
int mx_comp() {
int k = maxi;
return maxi;
}
int get_size(int u) {
return sz[find_root(u)];
}
};
pair<int, vector<pair<int, int>>> MST(vector < pair<int, pair<int, int>>> edges, int n) {
sort(edges.begin(), edges.end());
vector<pair<int, int>>mst_edges;
int total = 0;
DSU d(n);
for (auto& it : edges) {
int cost = it.first, u = it.second.first, v = it.second.second;
if (!d.are_connected(u, v)) {
d.unite(u, v);
mst_edges.push_back({ u, v });
total += cost;
}
}
return { total, mst_edges };
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8c3RyaW5nPgoKI2RlZmluZSBpbnQgbG9uZyBsb25nCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgRFNVIHsKcHJpdmF0ZToKICAgIHZlY3RvcjxpbnQ+cGFyZW50LCByYW5rLCBzejsKICAgIGludCBjb21wID0gMCwgbWF4aSA9IDA7CiAgICBzdGFjayA8IHBhaXI8aW50LCBwYWlyPGludCwgaW50Pj4+aGlzdG9yeTsKICAgIHN0YWNrPGludD5jaGVja3BvaW50OwpwdWJsaWM6CiAgICBEU1UoaW50IG4pIHsKICAgICAgICBwYXJlbnQucmVzaXplKG4gKyAxKTsKICAgICAgICByYW5rLnJlc2l6ZShuICsgMSk7CiAgICAgICAgc3ouYXNzaWduKG4gKyAxLCAxKTsKICAgICAgICBjb21wID0gbjsKICAgICAgICBtYXhpID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHBhcmVudFtpXSA9IGk7CiAgICB9CgogICAgaW50IGZpbmRfcm9vdChpbnQgbm9kZSkgewogICAgICAgIGlmIChub2RlID09IHBhcmVudFtub2RlXSkgcmV0dXJuIG5vZGU7CiAgICAgICAgcmV0dXJuIGZpbmRfcm9vdChwYXJlbnRbbm9kZV0pOwogICAgfQoKICAgIGludCB1bmlvbl9ieV9yYW5rKGludCB1LCBpbnQgdikgewogICAgICAgIGludCByb290X3UgPSBmaW5kX3Jvb3QodSksIHJvb3RfdiA9IGZpbmRfcm9vdCh2KTsKICAgICAgICBpZiAocm9vdF91ID09IHJvb3RfdikgcmV0dXJuIGNvbXA7CiAgICAgICAgY29tcC0tOwogICAgICAgIGlmIChyYW5rW3Jvb3RfdV0gPiByYW5rW3Jvb3Rfdl0pIHsKICAgICAgICAgICAgaGlzdG9yeS5wdXNoKHsgMCwge3Jvb3RfdiwgcGFyZW50W3Jvb3Rfdl19IH0pOwogICAgICAgICAgICBwYXJlbnRbcm9vdF92XSA9IHJvb3RfdTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhpc3RvcnkucHVzaCh7IDAsIHtyb290X3UsIHBhcmVudFtyb290X3VdfSB9KTsKICAgICAgICAgICAgcGFyZW50W3Jvb3RfdV0gPSByb290X3Y7CiAgICAgICAgICAgIGlmIChyYW5rW3Jvb3RfdV0gPT0gcmFua1tyb290X3ZdKSB7CiAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2goeyAxLCB7cm9vdF92LCByYW5rW3Jvb3Rfdl19IH0pOwogICAgICAgICAgICAgICAgcmFua1tyb290X3ZdKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXA7CiAgICB9CgogICAgaW50IHVuaW9uX2J5X3NpemUoaW50IHUsIGludCB2KSB7CiAgICAgICAgaW50IHJvb3RfdSA9IGZpbmRfcm9vdCh1KSwgcm9vdF92ID0gZmluZF9yb290KHYpOwogICAgICAgIGlmIChyb290X3UgPT0gcm9vdF92KSByZXR1cm4gY29tcDsKICAgICAgICBjb21wLS07CiAgICAgICAgaWYgKHN6W3Jvb3RfdV0gPCBzeltyb290X3ZdKSB7CiAgICAgICAgICAgIGhpc3RvcnkucHVzaCh7IDAsIHtyb290X3UsIHBhcmVudFtyb290X3VdfSB9KTsKICAgICAgICAgICAgaGlzdG9yeS5wdXNoKHsgMiwge3Jvb3Rfdiwgc3pbcm9vdF92XX0gfSk7CiAgICAgICAgICAgIHBhcmVudFtyb290X3VdID0gcm9vdF92OwogICAgICAgICAgICBzeltyb290X3ZdICs9IHN6W3Jvb3RfdV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBoaXN0b3J5LnB1c2goeyAwLCB7cm9vdF92LCBwYXJlbnRbcm9vdF92XX0gfSk7CiAgICAgICAgICAgIGhpc3RvcnkucHVzaCh7IDIsIHtyb290X3UsIHN6W3Jvb3RfdV19IH0pOwogICAgICAgICAgICBwYXJlbnRbcm9vdF92XSA9IHJvb3RfdTsKICAgICAgICAgICAgc3pbcm9vdF91XSArPSBzeltyb290X3ZdOwogICAgICAgIH0KICAgICAgICBtYXhpID0gbWF4KHsgbWF4aSwgc3pbcm9vdF92XSwgc3pbcm9vdF91XSB9KTsKICAgICAgICByZXR1cm4gY29tcDsKICAgIH0KCiAgICB2b2lkIHByZXNpc3QoKSB7CiAgICAgICAgY2hlY2twb2ludC5wdXNoKGhpc3Rvcnkuc2l6ZSgpKTsKICAgIH0KCiAgICBpbnQgcm9sbGJhY2soKSB7CiAgICAgICAgaWYgKGNoZWNrcG9pbnQuZW1wdHkoKSkgcmV0dXJuIGNvbXA7CiAgICAgICAgaW50IGNoZWNrID0gY2hlY2twb2ludC50b3AoKTsKICAgICAgICBjaGVja3BvaW50LnBvcCgpOwogICAgICAgIHdoaWxlIChoaXN0b3J5LnNpemUoKSA+IGNoZWNrKSB7CiAgICAgICAgICAgIGludCB0eXBlID0gaGlzdG9yeS50b3AoKS5maXJzdCwgbm9kZSA9IGhpc3RvcnkudG9wKCkuc2Vjb25kLmZpcnN0LCBsYXN0X3ZhbCA9IGhpc3RvcnkudG9wKCkuc2Vjb25kLnNlY29uZDsKICAgICAgICAgICAgaGlzdG9yeS5wb3AoKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gMCkgeyAvLyBwYXJlbnQKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRbbm9kZV0gIT0gbm9kZSkgewogICAgICAgICAgICAgICAgICAgIGNvbXArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudFtub2RlXSA9IGxhc3RfdmFsOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDEpIHsgLy8gcmFuawogICAgICAgICAgICAgICAgcmFua1tub2RlXSA9IGxhc3RfdmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7IC8vIHNpemUKICAgICAgICAgICAgICAgIHN6W25vZGVdID0gbGFzdF92YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXA7CiAgICB9CgogICAgaW50IHVuaXRlKGludCB1LCBpbnQgdikgewogICAgICAgIHJldHVybiB1bmlvbl9ieV9zaXplKHUsIHYpOwogICAgfQoKICAgIGJvb2wgYXJlX2Nvbm5lY3RlZChpbnQgdSwgaW50IHYpIHsKICAgICAgICByZXR1cm4gZmluZF9yb290KHUpID09IGZpbmRfcm9vdCh2KTsKICAgIH0KCiAgICBpbnQgbXhfY29tcCgpIHsKICAgICAgICBpbnQgayA9IG1heGk7CiAgICAgICAgcmV0dXJuIG1heGk7CiAgICB9CgogICAgaW50IGdldF9zaXplKGludCB1KSB7CiAgICAgICAgcmV0dXJuIHN6W2ZpbmRfcm9vdCh1KV07CiAgICB9Cgp9OwoKcGFpcjxpbnQsIHZlY3RvcjxwYWlyPGludCwgaW50Pj4+IE1TVCh2ZWN0b3IgPCBwYWlyPGludCwgcGFpcjxpbnQsIGludD4+PiBlZGdlcywgaW50IG4pIHsKICAgIHNvcnQoZWRnZXMuYmVnaW4oKSwgZWRnZXMuZW5kKCkpOwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+Pm1zdF9lZGdlczsKICAgIGludCB0b3RhbCA9IDA7CiAgICBEU1UgZChuKTsKICAgIGZvciAoYXV0byYgaXQgOiBlZGdlcykgewogICAgICAgIGludCBjb3N0ID0gaXQuZmlyc3QsIHUgPSBpdC5zZWNvbmQuZmlyc3QsIHYgPSBpdC5zZWNvbmQuc2Vjb25kOwogICAgICAgIGlmICghZC5hcmVfY29ubmVjdGVkKHUsIHYpKSB7CiAgICAgICAgICAgIGQudW5pdGUodSwgdik7CiAgICAgICAgICAgIG1zdF9lZGdlcy5wdXNoX2JhY2soeyB1LCB2IH0pOwogICAgICAgICAgICB0b3RhbCArPSBjb3N0OwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7IHRvdGFsLCBtc3RfZWRnZXMgfTsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsKICAgIAogICAgcmV0dXJuIDA7Cn0=