#include <bits/stdc++.h>
using namespace std;
long long n, m;
const long long mx = 1e3 + 100;
vector<int> adj[mx];
bool mark[mx];
bool col[mx];
int comp[mx];
int inx = 0;
int dis[mx];
int par[mx];
int cen[mx];
int dia[mx];
int fact[mx];
int ind = 0;
void dfs(int v) {
  mark[v] = true;
  col[v] = true;
  for (int i = 0; i < adj[v].size(); i++) {
    int x = adj[v][i];
    if (!mark[x]) dis[x] = dis[v] + 1, par[x] = v, comp[x] = comp[v], dfs(x);
  }
}
int find_dia(int v) {
  memset(mark, 0, sizeof mark);
  memset(dis, 0, sizeof dis);
  dfs(v);
  int v1 = v;
  for (int i = 1; i < n + 1; i++)
    if (dis[i] > dis[v1]) v1 = i;
  memset(mark, 0, sizeof mark);
  memset(dis, 0, sizeof dis);
  int v2 = v1;
  dfs(v1);
  for (int i = 1; i < n + 1; i++)
    if (dis[i] > dis[v2]) v2 = i;
  dia[comp[v]] = dis[v2];
  int cou = 0;
  int tmp = v2;
  while (cou != dis[v2] / 2) cou++, tmp = par[tmp];
  cen[comp[v]] = tmp;
  return dis[v2];
}
int main() {
  ios ::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  for (int i = 1; i < n + 1; i++)
    if (!mark[i]) inx++, comp[i] = inx, dfs(i);
  if (inx == 1)
    cout << find_dia(1);
  else {
    memset(col, 0, sizeof col);
    for (int i = 1; i < n + 1; i++)
      if (!col[i]) find_dia(i);
    int max = 1;
    for (int i = 1; i < inx + 1; i++)
      if (dia[i] > dia[max]) max = i;
    for (int i = 1; i < inx + 1; i++)
      if (i != max)
        adj[cen[i]].push_back(cen[max]), adj[cen[max]].push_back(cen[i]),
            fact[ind++] = cen[i];
    int cc = cen[max];
    cout << find_dia(1) << endl;
    for (int i = 0; i < ind; i++) cout << fact[i] << " " << cc << endl;
  }
  return 0;
}
