#include <bits/stdc++.h>
 
 
#pragma GCC optimize("Ofast,fast-math,unroll-loops")
#pragma GCC target("avx2,fma")
using namespace std;
#define ll long long
#define int ll
#define all(a) a.begin(),a.end()
#define allr(a) a.rbegin(),a.rend()
#define pb push_back
#define yes cout<<"YES"
#define no cout<<"NO"
#define endl '\n'
#define endll cout<<endl
#define Fast ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define F first
#define S second
#define im cout<<"IMPOSSIBLE"
const int N = 5e5 + 11;
const int NN = 106;
const int mo = 1e9 + 123;
const int mod = 1e9 + 7;
const int m = 1e9 + 123;
const int Mod = 998244353;
const ll inf = 1e18;
const int LOG = 19;
#define PI 3.14159265
 
 
int Lcm(int x, int y) {
    return x / __gcd(x, y) * y;
}
 
vector<int> v[N];
int vis[N];
 
void dfs(int node) {
    vis[node] = 1;
    for (auto i: v[node]) {
        if (vis[i])continue;
        dfs(i);
    }
}
 
void solve() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        v[x].pb(y);
        v[y].pb(x);
    }
    int cnt = 0;
    vector<int> ans;
    for (int i = 1; i <= n; i++) {
        if (vis[i])
            continue;
        dfs(i);
        cnt++;
        ans.pb(i);
    }
    cout << cnt - 1 << endl;
    for (int i = 1; i < ans.size(); ++i) {
        cout << ans[0] << " " << ans[i] << endl;
    }
 
}
 
 
int32_t main() {
    Fast;
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int t = 1;
    //cin >> t;
    for (int i = 1; i < t + 1; ++i) {
        // cout << "Case #" << i << ": ";
        solve();
    }
    return 0;
}