Link to this code: https://cses.fi/paste/3056a1d2fb9e7ce0c3ca0d/
# include <bits/stdc++.h>
using namespace std;
// # define int long long

vector<vector<int>> graph;
vector<bool> vis;

void dfs(int node) {
    if (vis[node]) return;
    vis[node] = 1;
    for (auto neig : graph[node]){
        dfs(neig);
    }
}

void solve() {
    int n, k, u, v; cin >> n >> k;
    graph.assign(n + 1, vector<int>());
    vis.assign(n + 1, 0);
    while (k--) {
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    vector<string> edges;
    int cnt = 0, prev = 0;
    for (int node = 1 ; node <= n ; ++node) {
        if (vis[node]) continue;
        if (prev) edges.push_back(to_string(prev) + ' ' + to_string(node) + '\n');
        dfs(node);
        cnt++;
        prev = node;
    }
    cnt--;

    cout << cnt << '\n';
    for (auto &edge:edges) cout << edge;
}

signed main() {
    solve();
    return 0;
}