#include <bits/stdc++.h>
using namespace std;
const int N = 1000, M = 2000;
int head[N + 10], ver[M + 10], nxt[M + 10], tot = 0;
void add(int x, int y) {
  ver[++tot] = y;
  nxt[tot] = head[x];
  head[x] = tot;
}
int col[N + 10], cnt = 0;
void dfs(int x) {
  col[x] = cnt;
  for (int i = head[x]; i; i = nxt[i]) {
    int y = ver[i];
    if (col[y]) continue;
    dfs(y);
  }
}
vector<int> seq[N + 10];
pair<int, int> que[N + 10];
int h = 1, t = 0, fa[N + 10];
bool vis[N + 10];
pair<int, int> bfs(int x, bool f) {
  memset(vis, 0, sizeof(vis));
  if (f) memset(fa, -1, sizeof(fa));
  h = 1;
  t = 0;
  pair<int, int> ans = make_pair(0, 0);
  que[++t] = make_pair(0, x);
  vis[x] = 1;
  while (h <= t) {
    pair<int, int> H = que[h++];
    ans = max(ans, H);
    for (int i = head[H.second]; i; i = nxt[i]) {
      int y = ver[i];
      if (vis[y]) continue;
      vis[y] = 1;
      if (f) fa[y] = H.second;
      que[++t] = make_pair(H.first + 1, y);
    }
  }
  return ans;
}
int dis[N + 10], v[N + 10];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    add(x, y);
    add(y, x);
  }
  int maxx = 0, f = 0;
  for (int i = 1; i <= n; i++) {
    if (!col[i]) {
      cnt++;
      dfs(i);
      pair<int, int> tmp = bfs(bfs(i, false).second, true);
      int y = tmp.second;
      if (tmp.first >= maxx) {
        maxx = tmp.first;
        f = cnt;
      }
      while (~y) {
        seq[cnt].push_back(y);
        y = fa[y];
      }
      v[cnt] = seq[cnt][seq[cnt].size() / 2];
    }
  }
  for (int i = 1; i <= cnt; i++) {
    if (i == f) continue;
    add(v[i], v[f]);
    add(v[f], v[i]);
  }
  printf("%d\n", bfs(bfs(1, false).second, false).first);
  for (int i = 1; i <= cnt; i++) {
    if (i == f) continue;
    printf("%d %d\n", v[i], v[f]);
  }
  return 0;
}
