tuple<ve, ValueT> solve(ve& edges, int nodes) {
    sort(edges.begin(), edges.end(), edge_compare);
    ve tree;
    DisjointSet ds(nodes);
    ValueT sum = 0;
    for (Edge e : edges) {
        if (!ds.sameSet(e.u, e.v)) {
            ds.join(e.u, e.v);
            tree.push_back(e);
            sum += e.w;
        } else if (tree.size() == nodes - 1) {
            break;
        }
    }
    return tuple<ve, ValueT>{tree, sum};
}