#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
bool vis[N];
vector<int> v[N];
int who;
int maxD;
int distFromFirst[N], distFromLast[N];
void dfs(int s, int d, int flag) {
  vis[s] = 1;
  if (!flag)
    distFromFirst[s] = d;
  else
    distFromLast[s] = d;
  if (d >= maxD) {
    maxD = d;
    who = s;
  }
  for (auto i : v[s]) {
    if (!vis[i]) dfs(i, d + 1, flag);
  }
  vis[s] = 0;
}
int center;
int D;
void visAll(int s) {
  vis[s] = 1;
  if ((distFromFirst[s] + distFromLast[s] == D) &&
      ((distFromFirst[s] == (D / 2)) || (distFromLast[s] == (D / 2))))
    center = s;
  for (auto i : v[s]) {
    if (!vis[i]) {
      visAll(i);
    }
  }
}
int main() {
  ios_base ::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  vector<pair<int, int> > centers;
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      maxD = 0;
      dfs(i, 0, 0);
      int U = who;
      maxD = 0;
      dfs(who, 0, 0);
      int V = who;
      maxD = 0;
      dfs(who, 0, 1);
      D = maxD;
      visAll(U);
      centers.push_back({D, center});
    }
  }
  sort(centers.begin(), centers.end(), greater<pair<int, int> >());
  vector<pair<int, int> > newEdges;
  int grandCenter = centers[0].second;
  for (int i = 1; i < (int)centers.size(); i++) {
    newEdges.push_back({grandCenter, centers[i].second});
    v[grandCenter].push_back(centers[i].second);
    v[centers[i].second].push_back(grandCenter);
  }
  memset(vis, 0, sizeof(vis));
  maxD = 0;
  dfs(1, 0, 0);
  maxD = 0;
  dfs(who, 0, 0);
  cout << maxD << "\n";
  for (auto i : newEdges) cout << i.first << " " << i.second << "\n";
  return 0;
}
