Given a weighted, undirected, and connected graph of V vertices and E edges. The task is to find the sum of weights of the edges of the Minimum Spanning Tree. 
Definition: A minimum spanning tree consists of N nodes and N-1 edges connecting all the nodes which have the minimum cost(sum of edge weights).
TC: O(n^2)
SC: O(n)
def prims_algorithm(n, edges):
    adj = {i: [] for i in range(n)}
    for x, y, weight in edges:
        adj[x].append((x, weight))
        adj[y].append((y, weight))
    key = [math.inf for _ in range(n)]
    mst = [False for _ in range(n)]
    parent = [-1 for _ in range(n)]
    
    key[0] = 0
    u = 0
    for i in range(n):
        mini = math.inf
        for j in range(n):
            if not mst[j] and key[j] < mini:
                u = j
                mini = key[j]
        mst[u] = True
        for nei, cost in adj[u]:
            if cost < key[nei] and not mst[nei]:
                key[nei] = cost
                parent[nei] = u
    
    return parent
TC: O(nlogn)
SC: O(n)
def prims_algorithm(n, edges):
    adj = {i: [] for i in range(n)}
    for x, y, weight in edges:
        adj[x].append((y, weight))
        adj[y].append((x, weight))
    
    key = [math.inf for _ in range(n)]
    mst = [False for _ in range(n)]
    parent = [-1 for _ in range(n)]
    
    key[0] = 0
    heap = [(0, key[0])]
    while heap:
        weight, u = heapq.heappop(heap)
        mst[u] = True
        for nei, cost in adj[u]:
            if cost < key[nei] and not mst[nei]:
                key[nei] = cost
                parent[nei] = u
                heapq.heappush(heap, (key[nei], nei))
    return parent