#include <bits/stdc++.h>
using namespace std;
int n, m, dist1[1010], dist2[1010];
const int INF = 999999999;
vector<int> G[1010];
vector<pair<int, int> > comp, ans;
bool vis[1010];
int bfs(int s, int *dist) {
  queue<int> q;
  q.push(s);
  for (int i = 0; i <= n; i++) {
    dist[i] = INF;
  }
  dist[s] = 0;
  int lst = -1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis[u] = 1;
    lst = u;
    for (int i = 0; i < G[u].size(); i++) {
      int v = G[u][i];
      if (dist[v] > dist[u] + 1) {
        dist[v] = dist[u] + 1;
        q.push(v);
      }
    }
  }
  return lst;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  memset(vis, 0, sizeof(vis));
  int mxd = -1, mxind = -1;
  for (int i = 1; i <= n; i++) {
    if (vis[i]) continue;
    int tmp = bfs(bfs(i, dist1), dist2);
    tmp = bfs(tmp, dist1);
    int d = 0, cen = -1;
    for (int j = 1; j <= n; j++) {
      if (dist2[j] != INF) {
        d = max(d, dist2[j]);
      }
    }
    for (int j = 1; j <= n; j++) {
      if (d / 2 == dist2[j] && dist1[j] == d - d / 2) {
        cen = j;
        break;
      }
    }
    comp.push_back(make_pair(d, cen));
    if (d > mxd) {
      mxind = cen;
      mxd = d;
    }
  }
  for (int i = 0; i < comp.size(); i++) {
    if (comp[i].second == mxind) continue;
    G[mxind].push_back(comp[i].second);
    G[comp[i].second].push_back(mxind);
    ans.push_back(make_pair(mxind, comp[i].second));
  }
  int dd = bfs(bfs(1, dist1), dist1);
  cout << dist1[dd] << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].first << " " << ans[i].second << endl;
  }
  return 0;
}
