#include <bits/stdc++.h>
using namespace std;
const int N = 1003;
int n, m, u, v;
bool visited[N];
vector<int> G[N];
vector<vector<int> > components;
int deep[N];
int rr;
int ans;
void findcomponents() {
  for (int i = 1; i <= n; i++) {
    if (visited[i]) continue;
    vector<int> c;
    queue<int> Q;
    Q.push(i);
    visited[i] = true;
    while (!Q.empty()) {
      u = Q.front();
      Q.pop();
      c.push_back(u);
      for (int j = 0; j < G[u].size(); j++) {
        v = G[u][j];
        if (visited[v]) continue;
        visited[v] = true;
        Q.push(v);
      }
    }
    components.push_back(c);
  }
  fill(visited, visited + N, false);
}
void bfs(int r) {
  deep[r] = 0;
  queue<int> Q;
  Q.push(r);
  visited[r] = true;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    if (ans < deep[u]) {
      rr = u;
      ans = deep[u];
    }
    for (int i = 0; i < G[u].size(); i++) {
      int v = G[u][i];
      if (!visited[v]) {
        visited[v] = true;
        deep[v] = deep[u] + 1;
        Q.push(v);
      }
    }
  }
  fill(visited, visited + N, false);
}
vector<pair<int, int> > center;
void maxpath(vector<int> c) {
  pair<int, int> x;
  int mindeep = 1e9;
  for (int i = 0; i < c.size(); i++) {
    int v = c[i];
    ans = 0;
    bfs(v);
    if (ans < mindeep) {
      mindeep = ans;
      x = make_pair(v, mindeep);
    }
  }
  center.push_back(x);
}
bool cmp(pair<int, int> a, pair<int, int> b) { return a.second > b.second; }
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  findcomponents();
  for (int i = 0; i < components.size(); i++) {
    maxpath(components[i]);
  }
  sort(center.begin(), center.end(), cmp);
  for (int i = 1; i < center.size(); i++) {
    G[center[0].first].push_back(center[i].first);
    G[center[i].first].push_back(center[0].first);
  }
  for (int i = 1; i <= n; i++) {
    bfs(i);
  }
  cout << ans << endl;
  for (int i = 1; i < center.size(); i++) {
    cout << center[0].first << " " << center[i].first << endl;
  }
}
