#include <bits/stdc++.h>
using namespace std;
int n, m, cnt;
vector<int> a[1005];
int id[1005];
int d[1005], fa[1005], c[1005];
pair<int, int> pos[1005];
void dfs(int u, int par) {
  id[u] = cnt;
  for (auto v : a[u]) {
    if (v == par) continue;
    dfs(v, u);
    c[u] = max(c[u], d[v] + 1);
    if (c[u] > d[u]) swap(c[u], d[u]);
  }
}
void _dfs(int u, int par) {
  id[u] = cnt;
  for (auto v : a[u]) {
    if (v == par) continue;
    if (d[v] + 1 == d[u])
      fa[v] = max(fa[u], c[u]) + 1;
    else
      fa[v] = max(fa[u], d[u]) + 1;
    _dfs(v, u);
  }
}
vector<pair<int, int> > kq;
bool comp(pair<int, int> a, pair<int, int> b) { return a.first > b.first; }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int u, v;
    cin >> u >> v;
    a[u].push_back(v);
    a[v].push_back(u);
  }
  if (m == n - 1) {
    int res = 0;
    dfs(1, -1);
    _dfs(1, -1);
    for (int i = 1; i <= n; ++i) res = max(res, fa[i] + d[i]);
    cout << res;
    return 0;
  }
  for (int i = 1; i <= n; ++i)
    if (!id[i]) ++cnt, dfs(i, -1);
  for (int i = 1; i <= n; ++i) id[i] = 0;
  cnt = 0;
  for (int i = 1; i <= n; ++i)
    if (!id[i]) ++cnt, _dfs(i, -1);
  for (int i = 1; i <= cnt; ++i) pos[i].first = 1e9;
  for (int i = 1; i <= n; ++i)
    if (pos[id[i]].first > max(fa[i], d[i]))
      pos[id[i]].first = max(fa[i], d[i]), pos[id[i]].second = i;
  sort(pos + 1, pos + cnt + 1, comp);
  for (int i = 2; i <= cnt; ++i) {
    kq.push_back({pos[1].second, pos[i].second});
    a[pos[1].second].push_back(pos[i].second);
    a[pos[i].second].push_back(pos[1].second);
  }
  int res = 0;
  for (int i = 1; i <= n; ++i) fa[i] = d[i] = c[i] = 0;
  dfs(1, -1);
  _dfs(1, -1);
  for (int i = 1; i <= n; ++i) res = max(res, max(fa[i], d[i]));
  cout << res << "\n";
  for (int i = 0; i <= kq.size() - 1; ++i)
    cout << kq[i].first << " " << kq[i].second << "\n";
}
