#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
using namespace std;
long long n, m;
vector<long long> g[200005];
map<long long, long long> viz;
vector<pair<long long, long long>> vec, vans;
vector<long long> v;
long long dfs(long long node, long long par) {
  long long maximum = 0;
  for (auto it : g[node]) {
    if (it != par) {
      maximum = max(maximum, dfs(it, node));
    }
  }
  return maximum + 1;
}
void dfs1(long long node) {
  v.push_back(node);
  viz[node] = 1;
  for (auto it : g[node]) {
    if (viz[it]) {
      continue;
    }
    dfs1(it);
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m;
  for (long long i = 1; i <= m; i++) {
    long long x, y;
    cin >> x >> y;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  long long d = 0;
  for (long long i = 1; i <= n; i++) {
    if (viz[i]) {
      continue;
    }
    v.clear();
    dfs1(i);
    long long mn = 1000000000000000005ll, mx = 0, pos = 0;
    for (auto it : v) {
      long long nr = dfs(it, 0);
      mx = max(mx, nr);
      d = max(d, nr);
      if (nr < mn) {
        mn = nr;
        pos = it;
      }
    }
    vec.push_back(make_pair(-mx, pos));
  }
  sort(vec.begin(), vec.end());
  vector<pair<long long, long long>> ans;
  for (long long i = 1; i < vec.size(); i++) {
    ans.push_back(make_pair(vec[0].second, vec[i].second));
    g[vec[0].second].push_back(vec[i].second);
    g[vec[i].second].push_back(vec[0].second);
  }
  long long res = 0;
  for (long long i = 1; i <= n; i++) {
    res = max(res, dfs(i, 0));
  }
  cout << res - 1 << '\n';
  for (auto it : ans) {
    cout << it.first << ' ' << it.second << '\n';
  }
}
