#include <bits/stdc++.h>
using namespace std;
vector<long long> adj[1000002];
bool visited[1000002];
long long childrenn[1000002];
long long Parent[1000002];
vector<pair<long long, long long> > c;
long long dia;
queue<long long> leavess;
long long dfs_find_diameter(long long u, long long p) {
  long long x = 0, y = 0;
  visited[u] = 1;
  Parent[u] = p;
  childrenn[u] = adj[u].size();
  for (auto v : adj[u]) {
    if (v == p) {
      continue;
    }
    long long z = 1 + dfs_find_diameter(v, u);
    if (z > x) {
      y = x;
      x = z;
    } else {
      y = max(y, z);
    }
  }
  if (adj[u].size() <= 1) {
    leavess.push(u);
  }
  dia = max(dia, y + x);
  return x;
}
long long bfs() {
  while (leavess.size() > 1) {
    for (auto v : adj[leavess.front()]) {
      childrenn[v]--;
      if (childrenn[v] == 1) {
        leavess.push(v);
      }
    }
    leavess.pop();
  }
  return leavess.front();
}
int main(int argc, char const *argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL), cout.tie(NULL);
  long long n, m, u, v, x, dia1 = 0, u_dia = 0;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    cin >> u >> v;
    --u, --v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < n; ++i) {
    if (!visited[i]) {
      dia = 0;
      dfs_find_diameter(i, i);
      u = bfs();
      dia1 = max(dia1, dia);
      ++dia;
      c.push_back(make_pair(dia, u));
      while (!leavess.empty()) leavess.pop();
    }
  }
  sort(c.begin(), c.end(), greater<pair<long long, long long> >());
  cout << "\n";
  if (c.size() >= 3) {
    cout << max(dia1, max(c[0].first / 2 + c[1].first / 2 + 1,
                          c[1].first / 2 + c[2].first / 2 + 2))
         << "\n";
  } else if (c.size() == 2) {
    cout << max(dia1, c[0].first / 2 + c[1].first / 2 + 1) << "\n";
  } else {
    cout << dia1 << "\n";
  }
  for (auto p : c) {
    if (c[0].second == p.second) {
      continue;
    }
    cout << p.second + 1 << " " << c[0].second + 1 << "\n";
  }
  return 0;
}
