#include <bits/stdc++.h>
using namespace std;
vector<int> graph[1001];
bool visited[1001];
void dfs(int node, int p, int h, int *diam, int *origin) {
  visited[node] = true;
  int temp = *diam;
  *diam = max(*diam, h);
  if (temp != *diam) *origin = node;
  for (vector<int>::iterator itr = graph[node].begin();
       itr != graph[node].end(); itr++)
    if (*itr != p) dfs(*itr, node, h + 1, diam, origin);
}
vector<int> component;
void collect(int node, int p) {
  visited[node] = true;
  component.push_back(node);
  for (vector<int>::iterator itr = graph[node].begin();
       itr != graph[node].end(); itr++)
    if (*itr != p) collect(*itr, node);
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i <= n; i++) visited[i] = false;
  vector<pair<int, int> > sol;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  map<int, vector<int> > dict;
  for (int i = 1; i <= n; i++) {
    if (!visited[i]) {
      component.clear();
      collect(i, -1);
      dict[i] = component;
    }
  }
  for (int i = 0; i <= n; i++) visited[i] = false;
  for (map<int, vector<int> >::iterator itr = dict.begin(); itr != dict.end();
       itr++) {
    int origin, diam, origin_fin;
    diam = -1;
    dfs(itr->first, -1, 0, &diam, &origin);
    diam = -1;
    origin_fin = origin;
    dfs(origin, -1, 0, &diam, &origin);
    int post = 1e9;
    for (int i = 0; i < (itr->second).size(); i++) {
      int temp_diam = -1;
      dfs(itr->second[i], -1, 0, &temp_diam, &origin);
      if (post > min(post, temp_diam)) {
        post = min(post, temp_diam);
        origin_fin = itr->second[i];
      }
    }
    sol.push_back({diam, origin_fin});
  }
  vector<pair<int, int> > ans;
  sort(sol.rbegin(), sol.rend());
  int start;
  if (!sol.empty()) {
    start = sol[0].second;
    for (int i = 1; i < sol.size(); i++) {
      graph[sol[i].second].push_back(start);
      graph[start].push_back(sol[i].second);
      ans.push_back({start, sol[i].second});
    }
  }
  int diam = -1, origin, origin_fin;
  dfs(1, -1, 0, &diam, &origin);
  diam = -1;
  origin_fin = origin;
  dfs(origin, -1, 0, &diam, &origin);
  cout << diam << endl;
  for (int i = 0; i < ans.size(); i++)
    cout << ans[i].first << " " << ans[i].second << endl;
  return 0;
}
