#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e17;
struct edge {
  int u, v;
  edge() {}
  edge(int _u, int _v) : u(_u), v(_v) {}
};
struct node {
  vector<edge> edges;
};
struct tree {
  vector<node> nodes;
  int root, n;
  tree(int _n, int _r = 0) : n(_n), root(_r) { nodes.resize(n); }
  void add_edge(int u, int v) {
    edge e1(u, v);
    edge e2(v, u);
    nodes[u].edges.push_back(e1);
    nodes[v].edges.push_back(e2);
  }
  vector<pair<int, int>> findDiametersAndCenters() {
    vector<pair<int, int>> ans;
    vector<bool> vis1(n, 0), vis2(n, 0);
    vector<int> parent(n, 0);
    for (int i = 0; i < n; i++) {
      if (vis1[i]) {
        continue;
      }
      int diameter, d1, d2;
      findDiameter(i, vis1, vis2, parent, diameter, d1, d2);
      int c = findCenter(d2, diameter, parent);
      ans.push_back({diameter, c});
    }
    return move(ans);
  }
  pair<int, int> bfs(int u, vector<bool> &visited, vector<int> &parent) {
    queue<pair<int, int>> Q;
    visited[u] = true;
    int dist = 0;
    Q.push({u, 0});
    while (!Q.empty()) {
      u = Q.front().first;
      dist = Q.front().second;
      Q.pop();
      for (auto &e : nodes[u].edges) {
        if (visited[e.v]) {
          continue;
        }
        visited[e.v] = true;
        Q.push({e.v, dist + 1});
        parent[e.v] = u;
      }
    }
    return {u, dist};
  }
  void findDiameter(int u, vector<bool> &vis1, vector<bool> &vis2,
                    vector<int> &parent, int &diameter, int &d1, int &d2) {
    d1 = bfs(u, vis1, parent).first;
    auto p = bfs(d1, vis2, parent);
    d2 = p.first;
    diameter = p.second;
  }
  int findCenter(int u, int diameter, vector<int> &parent) {
    diameter >>= 1;
    while (diameter--) {
      u = parent[u];
    }
    return u;
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n >> m;
  tree t(n);
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    t.add_edge(u, v);
  }
  vector<pair<int, int>> DnC = t.findDiametersAndCenters();
  sort(DnC.rbegin(), DnC.rend());
  int res = DnC[0].first;
  if (DnC.size() >= 2) {
    res = max(res, (DnC[0].first + 1) / 2 + (DnC[1].first + 1) / 2 + 1);
  }
  if (DnC.size() >= 3) {
    res = max(res, (DnC[1].first + 1) / 2 + (DnC[2].first + 1) / 2 + 2);
  }
  cout << res << '\n';
  for (int i = 1; i < DnC.size(); i++) {
    cout << DnC[i].second + 1 << ' ' << DnC[0].second + 1 << '\n';
  }
}
