#include <bits/stdc++.h>
using namespace std;
long long powmod(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
int d[MAXN];
int maxd, argd, mid, ok;
vector<int> G[MAXN];
int n, m;
bool vis[MAXN];
void dfs1(int u, int fa) {
  if (fa == -1)
    d[u] = 0;
  else
    d[u] = d[fa] + 1;
  if (d[u] > maxd) argd = u, maxd = d[u];
  for (int v : G[u]) {
    if (v == fa)
      continue;
    else
      dfs1(v, u);
  }
}
void dfs2(int u, int fa, int q) {
  if (q == u) ok = true, maxd /= 2;
  if (!ok)
    for (int v : G[u]) {
      if (ok) break;
      if (v == fa)
        continue;
      else
        dfs2(v, u, q);
    }
  if (ok && maxd == 0) mid = u;
  if (ok) maxd--;
}
pair<int, int> get_diameter(int i) {
  maxd = 0, argd = i;
  dfs1(i, -1);
  int p = argd;
  maxd = 0;
  dfs1(argd, -1);
  int q = argd, dia = maxd;
  ok = 0;
  dfs2(p, -1, q);
  return make_pair(dia, mid);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i < (m + 1); i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  vector<pair<int, int> > edge;
  int c = n - 1 - m;
  for (int _ = (0); _ < (c); _++) {
    memset(d, -1, sizeof d);
    pair<int, int> m1, m2, tmp;
    m1 = make_pair(-1, 0);
    m2 = make_pair(INF, 0);
    for (int i = (1); i < (n + 1); i++) {
      if (d[i] == -1) {
        tmp = get_diameter(i);
        if (m1.first < tmp.first) m1 = tmp;
        if (m2.first >= tmp.first) m2 = tmp;
      }
    }
    int u = m1.second, v = m2.second;
    edge.push_back(make_pair(u, v));
    G[u].push_back(v);
    G[v].push_back(u);
  }
  printf("%d\n", get_diameter(1).first);
  for (int i = (0); i < (c); i++)
    printf("%d %d\n", edge[i].first, edge[i].second);
  return 0;
}
