import java.util.*;

class Solution {
    public int solution(int n, int[][] costs) {
        //MST 포함되는 간선모으기용
        List<Edge> mstEdges = new ArrayList<>();
        //초기화
        PriorityQueue<Edge> pq = new PriorityQueue<>();
        for(int[] cost : costs){
            pq.add(new Edge(cost[0],cost[1],cost[2]));
        }
        DisjointSet disjointSet = new DisjointSet(n);
        while(!pq.isEmpty()){
            Edge edge = pq.poll();
            int rootS = disjointSet.find(edge.start);
            int rootE = disjointSet.find(edge.end);
            
            if(rootS != rootE){
                disjointSet.union(rootS, rootE);
                mstEdges.add(edge);
            }
            
            if(mstEdges.size() == n-1){
                break;
            }
        }
        
        int weightSum = 0;
        for(Edge edge : mstEdges){
            weightSum += edge.weight;
        }
        return weightSum;
    }
    
    class Edge implements Comparable<Edge>{
        int start;
        int end;
        int weight;
        
        public Edge(int s, int e, int w){
            this.start = s;
            this.end = e;
            this.weight = w;
        }
        
        @Override
        public int compareTo(Edge other){
            return this.weight - other.weight;
        }
    }
    
    class DisjointSet{
        int parent[];
        
        public DisjointSet(int n){
            parent = new int[n];
            for(int i=0 ; i<n ; i++){
                parent[i] = i;
            }
        }
        
        public void union(int i, int j){
            int rootI = find(i);
            int rootJ = find(j);
            
            if(rootI != rootJ){
                parent[rootI] = rootJ;
            }
        }
        
        public int find(int i){
            if(parent[i] == i){
                return i;
            }
            return parent[i] = find(parent[i]);        
        }
    }
}

/*
- 모두 이어진거 확인하는 법
- 적은 비용으로 모두 연결
- 음 아무래도 다익스트라......
MST? 
*/