struct Edge {
int u, v, dist;
};
bool cmp(Edge x, Edge y) { return x.dist < y.dist; }
vector <Edge> edges;
vector <int> g;
int fa[N];
void init() {
for (int i = 1; i <= n; i++) fa[i] = i;
}
int find_set(int x) {
if (fa[x] == x) return x;
return fa[x] = find_set(fa[x]);
}
void merge_set(int x, int y) {
fa[find_set(x)] = find_set(y);
}
bool is_in_same_set(int x, int y) {
return find_set(x) == find_set(y);
}
int kruskal() {
sort(edges.begin(), edges.end(), cmp);
int ans = 0;
for (Edge e : edges) {
int u = e.u, v = e.v, dist = e.dist;
if (is_in_same_set(u, v)) continue;
g[u].push_back(v);
ans += dist;
}
return ans;
}