#include <bits/stdc++.h>
using namespace std;
struct EDGE {
  int v, next;
} edge[3010];
struct ZX {
  int dian, zj;
} xd[1010];
bool cmp(const ZX& ax, const ZX& ay) { return ax.zj < ay.zj; }
int n, m;
int ind[1010];
bool vist[1010];
int sz[1010];
int dep[1010];
int fff[1010];
int fa[1010];
int tot = 0;
int zda = 0;
int ttt = 0;
int nd;
int all;
int zzzx = 0;
void add(int aa, int bb) {
  tot++;
  edge[tot].v = bb;
  edge[tot].next = ind[aa];
  ind[aa] = tot;
}
void dfss(int x, int fx, int dp) {
  int i;
  dep[x] = dp;
  fff[x] = fx;
  for (i = ind[x]; i != -1; i = edge[i].next) {
    if (fx == edge[i].v) continue;
    dfss(edge[i].v, x, dp + 1);
  }
}
int fi(int x) {
  if (x == fa[x]) return x;
  int ff = fa[x];
  fa[x] = fi(ff);
  return fa[x];
}
int main() {
  int i, aa, bb, j;
  memset(ind, -1, sizeof(ind));
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) fa[i] = i;
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &aa, &bb);
    add(aa, bb);
    add(bb, aa);
    int ffa = fi(aa);
    int ffb = fi(bb);
    if (ffa != ffb) fa[ffa] = ffb;
  }
  int my;
  for (i = 1; i <= n; i++) my = fi(i);
  for (i = 1; i <= n; i++) {
    if (!vist[fa[i]]) {
      vist[fa[i]] = 1;
      zda = 0x3f3f3f3f;
      nd = 0;
      all = 0;
      for (j = 1; j <= n; j++)
        if (fa[j] == fa[i]) all++;
      dfss(i, 0, 0);
      int lsmx = -1;
      int kkksc = 0;
      for (j = 1; j <= n; j++)
        if (fa[j] == fa[i] && dep[j] > lsmx) {
          lsmx = dep[j];
          kkksc = j;
        }
      lsmx = -1;
      dfss(kkksc, 0, 0);
      for (j = 1; j <= n; j++)
        if (fa[j] == fa[i] && dep[j] > lsmx) {
          lsmx = dep[j];
          kkksc = j;
        }
      xd[++ttt].zj = lsmx;
      zzzx = lsmx / 2;
      int tmp = kkksc;
      while (dep[tmp] != zzzx) {
        tmp = fff[tmp];
      }
      xd[ttt].dian = tmp;
    }
  }
  sort(xd + 1, xd + ttt + 1, cmp);
  for (i = 1; i < ttt; i++) {
    add(xd[ttt].dian, xd[i].dian);
    add(xd[i].dian, xd[ttt].dian);
  }
  dfss(1, 0, 0);
  int lsmx = 0;
  int kkksc = 0;
  for (j = 1; j <= n; j++)
    if (dep[j] > lsmx) {
      lsmx = dep[j];
      kkksc = j;
    }
  lsmx = 0;
  dfss(kkksc, 0, 0);
  for (j = 1; j <= n; j++)
    if (dep[j] > lsmx) {
      lsmx = dep[j];
      kkksc = j;
    }
  printf("%d\n", lsmx);
  for (i = 1; i < ttt; i++) printf("%d %d\n", xd[ttt].dian, xd[i].dian);
  return 0;
}
