def kruskal(graph):
    djs = DisjointSet(numel=len(graph.nodes))
    all_nodes = set(range(len(graph.nodes)))
    weight = 0
    edges = list(graph.get_edges())
    edges.sort(key=lambda tup: tup[2])
    fs = set()

    for e in edges:
        source = e[0]
        dest = e[1]
        wt = e[2]

        if not djs.same_set(source, dest):
            fs.add(source)
            fs.add(dest)
            weight += wt
            djs.union(source, dest)

    return weight