#include <bits/stdc++.h>
using namespace std;
vector<int> g[1005];
bool used[1005];
int dist[1005], diam = 0;
pair<int, int> get(vector<int> who) {
  pair<int, int> res = {1e9 + 7, -1};
  for (auto st : who) {
    for (auto v : who) used[v] = 0;
    deque<int> q = {st};
    used[st] = 1;
    dist[st] = 0;
    while (!q.empty()) {
      int v = q.front();
      q.pop_front();
      for (auto u : g[v]) {
        if (!used[u]) {
          dist[u] = dist[v] + 1;
          q.push_back(u);
          used[u] = true;
        }
      }
    }
    pair<int, int> now = {0, st};
    for (auto v : who) now.first = max(now.first, dist[v]);
    res = min(res, now);
    diam = max(diam, now.first);
  }
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  while (m--) {
    int v, u;
    cin >> v >> u;
    g[--v].push_back(--u);
    g[u].push_back(v);
  }
  vector<pair<int, int>> kek;
  for (int i = 0; i < n; ++i) {
    if (!used[i]) {
      vector<int> who;
      used[i] = 1;
      deque<int> q = {i};
      while (!q.empty()) {
        int v = q.front();
        q.pop_front();
        who.push_back(v);
        for (auto u : g[v]) {
          if (!used[u]) {
            q.push_back(u);
            used[u] = 1;
          }
        }
      }
      kek.push_back(get(who));
    }
  }
  sort(kek.rbegin(), kek.rend());
  for (int i = 1; i < kek.size(); ++i) {
    diam = max(diam, kek[i].first + 1 + kek[0].first);
    for (int j = 1; j < kek.size(); ++j) {
      if (j != i) diam = max(diam, kek[j].first + kek[i].first + 2);
    }
  }
  cout << diam << '\n';
  for (int i = 1; i < kek.size(); ++i)
    cout << kek[0].second + 1 << " " << kek[i].second + 1 << '\n';
  return 0;
}
