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;
}