#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 5;
class edge {
 public:
  int v, pre;
  edge(int _v = 0, int _pre = -1) : v(_v), pre(_pre) {}
};
int head[MAXN];
edge input[MAXN << 1];
int cnt;
int n, m;
void addedge(int u, int v) {
  input[cnt] = edge(v, head[u]);
  head[u] = cnt++;
}
int deep[MAXN];
int pre[MAXN];
void dfs(int now) {
  for (int i = head[now]; ~i; i = input[i].pre) {
    if (deep[input[i].v] == -1) {
      deep[input[i].v] = deep[now] + 1;
      pre[input[i].v] = now;
      dfs(input[i].v);
    }
  }
}
int findroot(int x) {
  memset(deep, -1, sizeof(deep));
  deep[x] = 0;
  dfs(x);
  int nmax, f;
  f = max_element(deep + 1, deep + 1 + n) - deep, nmax = deep[f];
  memset(deep, -1, sizeof(deep));
  deep[f] = 0;
  dfs(f);
  f = max_element(deep + 1, deep + 1 + n) - deep, nmax = deep[f];
  for (int i = 0; i < (nmax + 1) / 2; i++) f = pre[f];
  return f;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  memset(head, -1, sizeof(head));
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    addedge(u, v);
    addedge(v, u);
  }
  vector<pair<int, int>> add;
  vector<pair<int, int>> tree;
  memset(deep, -1, sizeof(deep));
  for (int i = 1; i <= n; i++)
    if (deep[i] == -1) {
      int t = findroot(i);
      tree.emplace_back(t, *max_element(deep + 1, deep + 1 + n));
    }
  sort(tree.begin(), tree.end(),
       [](const pair<int, int> &a, const pair<int, int> &b) {
         return a.second > b.second;
       });
  for (int i = 1; i < tree.size(); i++) {
    addedge(tree[0].first, tree[i].first);
    addedge(tree[i].first, tree[0].first);
    add.emplace_back(tree[0].first, tree[i].first);
  }
  findroot(1);
  cout << *max_element(deep + 1, deep + 1 + n) << endl;
  for (auto x : add) cout << x.first << " " << x.second << "\n";
  return 0;
}
