#include <bits/stdc++.h>
using namespace std;
void ff(vector<int> e[], int x, int clr[], int c) {
  if (clr[x] == c) {
    return;
  }
  clr[x] = c;
  for (int y : e[x]) {
    ff(e, y, clr, c);
  }
}
void dfs(vector<int> e[], int x, int p[], int h[]) {
  for (int y : e[x]) {
    if (y != p[x]) {
      p[y] = x;
      h[y] = h[x] + 1;
      dfs(e, y, p, h);
    }
  }
}
pair<int, int> fd(vector<int> e[], int n, int x) {
  int h[n], p[n];
  fill(h, h + n, -1);
  h[x] = 0;
  p[x] = -1;
  dfs(e, x, p, h);
  int d1 = max_element(h, h + n) - h;
  fill(h, h + n, -1);
  h[d1] = 0;
  p[d1] = -1;
  dfs(e, d1, p, h);
  int d2 = max_element(h, h + n) - h;
  int diam = h[d2];
  int ct = d2;
  for (int i = 0; i < diam / 2; i++) {
    ct = p[ct];
  }
  return {diam, ct};
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  vector<int> e[n];
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    e[a].push_back(b);
    e[b].push_back(a);
  }
  int clr[n];
  fill(clr, clr + n, -1);
  int cc = 0;
  for (int i = 0; i < n; i++) {
    if (clr[i] == -1) {
      ff(e, i, clr, cc++);
    }
  }
  pair<int, int> dc[cc], di[cc];
  fill(dc, dc + cc, pair<int, int>(-1, -1));
  for (int i = 0; i < n; i++) {
    if (dc[clr[i]].first == -1) {
      dc[clr[i]] = fd(e, n, i);
      di[clr[i]] = {dc[clr[i]].first, clr[i]};
    }
  }
  sort(di, di + cc);
  vector<pair<int, int> > ans;
  for (int i = 0; i < n - 1 - m; i++) {
    int x = dc[di[cc - 1].second].second;
    int y = dc[di[i].second].second;
    e[x].push_back(y);
    e[y].push_back(x);
    ans.push_back({x, y});
    int cy = clr[y];
    for (int i = 0; i < n; i++) {
      if (clr[i] == cy) {
        clr[i] = clr[x];
      }
    }
    dc[clr[x]] = fd(e, n, x);
  }
  cout << dc[di[cc - 1].second].first << endl;
  for (pair<int, int> p : ans) {
    cout << p.first + 1 << " " << p.second + 1 << endl;
  }
  return 0;
}
