#include <bits/stdc++.h>
using namespace std;
int n, m, vis[1005];
vector<int> g[1005];
vector<int> v;
int mx, mxv, md;
vector<int> ind;
void dfs(int x, int dep, int col) {
  vis[x] = col;
  ind.push_back(x);
  if (dep > mx) {
    mx = dep;
    mxv = x;
    md = ind[(int)ind.size() / 2];
  }
  for (auto to : g[x]) {
    if (vis[to] < col) {
      dfs(to, dep + 1, col);
    }
  }
  ind.pop_back();
}
vector<pair<int, int> > comments;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      mx = -1;
      mxv = -1;
      dfs(i, 0, 1);
      mx = -1;
      md = -1;
      dfs(mxv, 0, 2);
      comments.push_back(make_pair(mx, md));
    }
  }
  sort(comments.begin(), comments.end());
  vector<pair<int, int> > ans;
  ans.clear();
  for (int i = 0; i + 1 < comments.size(); i++) {
    int now = comments[i].second, to = comments.size();
    to--;
    to = comments[to].second;
    g[to].push_back(now);
    g[now].push_back(to);
    ans.push_back(make_pair(now, to));
  }
  memset(vis, 0, sizeof vis);
  mx = -1;
  dfs(1, 0, 1);
  mx = -1;
  dfs(mxv, 0, 2);
  cout << mx << endl;
  for (auto p : ans) cout << p.first << " " << p.second << endl;
  return 0;
}
