@dataclass
class Edge:
u: int
v: int
w: float
def kruskal_mst(num_edges: int, edges: List[Edge]) -> Tuple[List[Edge], float]:
edges.sort(key=lambda x: x.w)
dsu = DisjointSetUnion(num_edges)
mst = []
total_weight = 0
for edge in edges:
if dsu.find(edge.u) != dsu.find(edge.v):
dsu.union(edge.u, edge.v)
mst.append(edge)
total_weight += edge.w
return mst, total_weight