#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cout << *it << " = " << a << endl;
  err(++it, args...);
}
const int MAX = 1005;
vector<int> g[MAX], comp;
int d[MAX], par[MAX];
bool vis[MAX];
void dfs(int u, int p) {
  vis[u] = true;
  comp.push_back(u);
  for (int v : g[u]) {
    if (v != p) {
      d[v] = d[u] + 1;
      par[v] = u;
      dfs(v, u);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  vector<int> nodes;
  int root = 0, len = 0;
  for (int i = 1; i <= n; i++) {
    if (vis[i]) {
      continue;
    }
    comp.clear();
    dfs(i, 0);
    int a = 0, b = 0;
    for (int u : comp) {
      if (d[u] >= d[a]) {
        a = u;
      }
    }
    comp.clear();
    d[a] = 0;
    dfs(a, 0);
    for (int u : comp) {
      if (d[u] >= d[b]) {
        b = u;
      }
    }
    vector<int> path;
    while (b != a) {
      path.push_back(b);
      b = par[b];
    }
    path.push_back(b);
    nodes.push_back(path[path.size() / 2]);
    if ((int)path.size() > len) {
      len = path.size();
      root = path[path.size() / 2];
    }
  }
  for (int u : nodes) {
    if (u != root) {
      g[u].push_back(root);
      g[root].push_back(u);
    }
  }
  d[root] = 0;
  dfs(root, 0);
  int u = max_element(d + 1, d + n + 1) - d;
  d[u] = 0;
  dfs(u, 0);
  cout << *max_element(d + 1, d + n + 1) << "\n";
  for (int u : nodes) {
    if (u != root) {
      cout << u << " " << root << "\n";
    }
  }
  return 0;
}
