#include <bits/stdc++.h>
using namespace std;
template <typename U, typename V>
inline void smax(U &a, const V &b) {
  if (a < b) a = b;
}
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const double pi = acosl(-1.), eps = 1e-9;
const int NN = 1010;
int hd[NN];
int nx[NN << 1];
int to[NN << 1];
int E;
void add(int u, int v) {
  nx[E] = hd[u];
  to[E] = v;
  hd[u] = E++;
  nx[E] = hd[v];
  to[E] = u;
  hd[v] = E++;
}
int flag[NN];
int father[NN];
int id[NN];
int crr_dp, crr_id;
pair<int, int> p[NN];
void dfs(int u, int dp = 0, int key = 1) {
  flag[u] = key;
  if (crr_dp < dp) {
    crr_id = u;
    crr_dp = dp;
  }
  for (int e = hd[u]; ~e; e = nx[e]) {
    int v = to[e];
    if (flag[v] == key) continue;
    father[v] = u;
    dfs(v, dp + 1, key);
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  memset(hd, -1, sizeof(hd));
  for (int i = 0, u, v; i < m; i++) {
    scanf("%d%d", &u, &v);
    add(u, v);
  }
  m = 0;
  for (int i = 1, u, v; i <= n; i++) {
    if (!flag[i]) {
      crr_dp = -1;
      dfs(i);
      crr_dp = -1;
      dfs(u = crr_id, 0, 2);
      v = crr_id;
      for (int j = 0; j < crr_dp / 2; j++) {
        v = father[v];
      }
      p[m++] = pair<int, int>(crr_dp, v);
    }
  }
  sort(p, p + m,
       [](pair<int, int> a, pair<int, int> b) { return a.first > b.first; });
  int dia = p[0].first;
  if (m > 1) smax(dia, (p[0].first + 1 >> 1) + 1 + (p[1].first + 1 >> 1));
  if (m > 2) smax(dia, (p[1].first + 1 >> 1) + 2 + (p[2].first + 1 >> 1));
  printf("%d\n", dia);
  for (int i = 1; i < m; i++) {
    printf("%d %d\n", p[0].second, p[i].second);
  }
  return 0;
}
