#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 100;
int N, M;
bitset<MAXN> v;
vector<int> a[MAXN];
;
int p[MAXN], d[MAXN];
queue<int> x;
array<int, 2> far(int n) {
  while (not x.empty()) x.pop();
  x.push(n);
  int r;
  p[n] = -1, d[n] = 0;
  while (not x.empty()) {
    r = x.front();
    x.pop();
    v[r] = true;
    for (int u : a[r]) {
      if (p[r] == u) continue;
      p[u] = r, d[u] = d[r] + 1;
      x.push(u);
    }
  }
  return {r, d[r]};
}
array<int, 2> center(int n) {
  array<int, 2> s = far(far(n).at(0));
  int r = s.at(0);
  for (int i = 0; i << 1 < s.at(1); i++, r = p[r])
    ;
  return {r, s.at(1)};
}
vector<array<int, 2> > T;
int max(int a, int b, int c) {
  if (a < b) a = b;
  if (a < c) a = c;
  return a;
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 0, u, w; i < M; i++) {
    scanf("%d%d", &u, &w);
    a[u].push_back(w);
    a[w].push_back(u);
  }
  if (M + 1 == N) {
    printf("%d\n", far(far(1).at(0)).at(1));
    return 0;
  }
  for (int i = 1; i <= N; i++) v[i] = false;
  for (int i = 1; i <= N; i++)
    if (not v[i]) T.push_back(center(i));
  assert(T.size() > 1);
  sort(T.begin(), T.end(), [](const array<int, 2>& z, const array<int, 2>& y) {
    return z.at(1) > y.at(1);
  });
  if (T.size() == 2) {
    printf(
        "%d\n%d %d\n",
        max(T[0].at(1), ((1 + T[0].at(1)) >> 1) + 1 + ((1 + T[1].at(1)) >> 1)),
        T[0].at(0), T[1].at(0));
  } else {
    printf("%d\n", max(T[0].at(1),
                       ((1 + T[0].at(1)) >> 1) + 1 + ((1 + T[1].at(1)) >> 1),
                       ((1 + T[1].at(1)) >> 1) + 2 + ((1 + T[2].at(1)) >> 1)));
    for (int i = 1; i < T.size(); i++)
      printf("%d %d\n", T[0].at(0), T[i].at(0));
  }
  return 0;
}
