#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int s = 0, w = 1, ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    s = (s << 3) + (s << 1) + ch - 48;
    ch = getchar();
  }
  return s * w;
}
const int maxn = 1e3 + 50;
int n, m, cnt, head[maxn], to[maxn * 2], nex[maxn * 2];
int fa[maxn];
int ans, RESU, RESLEN, id, cen[maxn], d[maxn], fs[maxn];
bool bj[maxn];
inline int find(int x) {
  if (fa[x] == x) return x;
  return fa[x] = find(fa[x]);
}
inline void merge(int x, int y) {
  x = find(x);
  y = find(y);
  fa[x] = y;
}
void add(int x, int y) {
  to[++cnt] = y;
  nex[cnt] = head[x];
  head[x] = cnt;
}
bool cmp(int x, int y) { return d[x] > d[y]; }
bool dfs(int u, int fa, int dis) {
  if (dis >= RESLEN) RESU = u, RESLEN = dis;
  bool bj = 0;
  for (int i = head[u]; i; i = nex[i]) {
    int v = to[i];
    if (v == fa) continue;
    if (dfs(v, u, dis + 1)) bj = 1;
  }
  if (dis == (RESLEN + 1) / 2 && (cen[id] == 0 || bj == 1)) cen[id] = u;
  return bj;
}
void getdiameter(int x) {
  id++;
  RESU = RESLEN = 0;
  dfs(x, 0, 0);
  x = RESU;
  RESU = RESLEN = 0;
  cen[id] = 0;
  dfs(x, 0, 0);
  ans = max(ans, RESLEN);
  d[id] = (RESLEN + 1) / 2;
}
signed main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read();
    add(x, y);
    add(y, x);
    merge(x, y);
  }
  for (int i = 1; i <= n; i++) {
    if (bj[find(i)]) continue;
    bj[find(i)] = 1;
    getdiameter(i);
  }
  if (id == 1) {
    printf("%d\n", ans);
    return 0;
  }
  for (int i = 1; i <= id; i++) fs[i] = i;
  sort(fs + 1, fs + 1 + id, cmp);
  for (int i = 2; i <= id; i++) ans = max(ans, d[fs[1]] + d[fs[i]] + 1);
  for (int i = 3; i <= id; i++) ans = max(ans, d[fs[2]] + d[fs[i]] + 2);
  printf("%d\n", ans);
  for (int i = 2; i <= id; i++) printf("%d %d\n", cen[fs[1]], cen[fs[i]]);
  return 0;
}
