#include <bits/stdc++.h>
using namespace std;
int level[1005];
queue<int> pos;
vector<int> adj[1005];
pair<int, int> bfs(int S) {
  int las = S;
  vector<int> lis;
  pos.push(S);
  level[S] = 0;
  int mov = 0;
  while (!pos.empty()) {
    int p = pos.size();
    for (int x = 0; x < p; x++) {
      int u = pos.front();
      lis.push_back(u);
      pos.pop();
      for (int z = 0; z < adj[u].size(); z++) {
        int v = adj[u][z];
        if (level[v] == -1) {
          level[v] = mov + 1;
          pos.push(v);
        }
      }
    }
    mov++;
  }
  for (int a = 0; a < lis.size(); a++) {
    int u = lis[a];
    level[u] = -1;
  }
  pos.push(lis.back());
  level[lis.back()] = 0;
  mov = 0;
  while (!pos.empty()) {
    int p = pos.size();
    for (int x = 0; x < p; x++) {
      int u = pos.front();
      pos.pop();
      for (int z = 0; z < adj[u].size(); z++) {
        int v = adj[u][z];
        if (level[v] == -1) {
          level[v] = mov + 1;
          pos.push(v);
        }
      }
    }
    mov++;
  }
  for (int a = 0; a < lis.size(); a++) {
    int u = lis[a];
    if (level[u] == mov / 2) return pair<int, int>(u, mov);
  }
  return pair<int, int>(0, 0);
}
int find_dia(int S) {
  int las = S;
  int mov = 0;
  memset(level, -1, sizeof(level));
  level[S] = 0;
  pos.push(S);
  while (!pos.empty()) {
    int p = pos.size();
    for (int x = 0; x < p; x++) {
      int u = pos.front();
      pos.pop();
      las = u;
      for (int z = 0; z < adj[u].size(); z++) {
        int v = adj[u][z];
        if (level[v] == -1) {
          level[v] = mov + 1;
          pos.push(v);
        }
      }
    }
    mov++;
  }
  pos.push(las);
  memset(level, -1, sizeof(level));
  level[las] = 0;
  mov = 0;
  while (!pos.empty()) {
    int p = pos.size();
    for (int x = 0; x < p; x++) {
      int u = pos.front();
      pos.pop();
      las = u;
      for (int z = 0; z < adj[u].size(); z++) {
        int v = adj[u][z];
        if (level[v] == -1) {
          level[v] = mov + 1;
          pos.push(v);
        }
      }
    }
    mov++;
  }
  return mov - 1;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int a = 0; a < m; a++) {
    int l, r;
    scanf("%d%d", &l, &r);
    adj[l].push_back(r);
    adj[r].push_back(l);
  }
  memset(level, -1, sizeof(level));
  vector<pair<int, int> > dj;
  for (int a = 1; a <= n; a++) {
    if (level[a] == -1) {
      dj.push_back(bfs(a));
    }
  }
  int ix = 0;
  for (int a = 1; a < dj.size(); a++) {
    if (dj[a].second > dj[ix].second) {
      ix = a;
    }
  }
  vector<pair<int, int> > edlis;
  for (int a = 0; a < dj.size(); a++) {
    if (a == ix) continue;
    edlis.push_back(pair<int, int>(dj[a].first, dj[ix].first));
    adj[dj[a].first].push_back(dj[ix].first);
    adj[dj[ix].first].push_back(dj[a].first);
  }
  printf("%d\n", find_dia(1));
  for (int z = 0; z < edlis.size(); z++) {
    printf("%d %d\n", edlis[z].first, edlis[z].second);
  }
  return 0;
}
