#include <bits/stdc++.h>
using namespace std;
const int maxn = 1007;
vector<int> g[maxn];
int e, vis[maxn], e1, top, s[maxn];
pair<int, int> mx[maxn];
void dfs(int u, int fa) {
  s[++top] = u;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == fa) continue;
    dfs(v, u);
  }
}
int dp(int u, int fa) {
  int mx1 = 0, mx2 = 0;
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == fa) continue;
    int x = (dp(v, u) + 1);
    if (x > mx1)
      mx2 = mx1, mx1 = x;
    else if (x > mx2)
      mx2 = x;
  }
  e = max(e, mx1 + mx2);
  return mx1;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      int ans = (1 << 29);
      top = 0;
      dfs(i, 0);
      int pos = 0;
      for (int k = 1; k <= top; k++) {
        vis[s[k]] = 1;
        int x = dp(s[k], 0);
        if (x < ans) {
          ans = x;
          pos = s[k];
        }
      }
      mx[++e1] = make_pair(ans, pos);
    }
  }
  sort(mx + 1, mx + e1 + 1);
  if (e1 == 1)
    printf("%d", e);
  else {
    int ans = 0;
    if (e1 >= 3 && mx[e1].first == mx[e1 - 1].first &&
        mx[e1].first == mx[e1 - 2].first)
      ans = mx[e1].first * 2 + 2;
    else
      ans = mx[e1].first + mx[e1 - 1].first + 1;
    ans = max(ans, e);
    cout << ans << endl;
    for (int i = 1; i < e1; i++) {
      printf("%d %d\n", mx[i].second, mx[e1].second);
    }
  }
  return 0;
}
