#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 3;
const long long mod = 998244353;
vector<long long> graph[1003];
vector<long long> visited(1003, 0);
vector<long long> visited2(1003, 0);
int len = 0;
int ver = 0;
void dfsfar(long long a, long long l) {
  if (l > len) {
    len = l;
    ver = a;
  }
  visited[a] = 1;
  for (int i = 0; i < graph[a].size(); i++) {
    long long u = graph[a][i];
    if (!visited[u]) {
      dfsfar(u, l + 1);
    }
  }
}
int dfs(long long u, long long v) {
  if (u == v) {
    if (len == 0) ver = u;
    len--;
    return 1;
  }
  visited[u] = 1;
  for (int i = 0; i < graph[u].size(); i++) {
    long long a = graph[u][i];
    if (!visited[a]) {
      if (dfs(a, v)) {
        if (len == 0) ver = u;
        len--;
        return 1;
      }
    }
  }
  return 0;
}
void dfsvisitor(long long a) {
  visited2[a] = 1;
  for (int i = 0; i < graph[a].size(); i++) {
    long long u = graph[a][i];
    if (!visited2[u]) {
      dfsvisitor(u);
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long i = 0;
  vector<long long> v;
  long long n, a, m, b;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  ver = 1;
  dfsfar(1, 0);
  long long u = ver;
  for (i = 1; i <= n; i++) {
    visited[i] = 0;
  }
  len = 0;
  dfsfar(u, 0);
  long long maxlen = len;
  len /= 2;
  for (i = 1; i <= n; i++) {
    visited[i] = 0;
  }
  dfs(u, ver);
  dfsvisitor(1);
  long long head = ver;
  vector<long long> ans;
  ans.push_back(head);
  for (i = 1; i <= n; i++) {
    if (!visited2[i]) {
      len = 0;
      for (int i = 1; i <= n; i++) {
        visited[i] = 0;
      }
      ver = i;
      dfsfar(i, 0);
      len = 0;
      long long u = ver;
      for (int i = 1; i <= n; i++) {
        visited[i] = 0;
      }
      dfsfar(u, 0);
      long long x = len;
      len /= 2;
      for (int i = 1; i <= n; i++) {
        visited[i] = 0;
      }
      dfs(u, ver);
      ans.push_back(ver);
      if (x > maxlen) {
        head = ver;
        maxlen = x;
      }
      dfsvisitor(i);
    }
  }
  for (i = 0; i < ans.size(); i++) {
    if (head == ans[i]) continue;
    graph[head].push_back(ans[i]);
    graph[ans[i]].push_back(head);
  }
  for (i = 1; i <= n; i++) {
    visited[i] = 0;
  }
  len = 0;
  ver = 1;
  dfsfar(1, 0);
  len = 0;
  u = ver;
  for (i = 1; i <= n; i++) {
    visited[i] = 0;
  }
  dfsfar(u, 0);
  cout << len << endl;
  for (i = 0; i < ans.size(); i++) {
    if (head == ans[i]) continue;
    cout << head << " " << ans[i] << endl;
  }
}
