#include <bits/stdc++.h>
using namespace std;
long long INF = numeric_limits<long long>::max();
const long long MAXN = 100010;
bool vis[MAXN];
vector<long long> adj[MAXN];
map<long long, long long> deg;
vector<pair<long long, long long>> dicent;
void dfs(long long u, queue<long long> &q) {
  vis[u] = true;
  if (deg[u] <= 1) q.push(u);
  for (long long v : adj[u])
    if (!vis[v]) dfs(v, q);
}
void solve(long long src) {
  queue<long long> q;
  dfs(src, q);
  long long dia = 0, cent, siz;
  while (!q.empty()) {
    siz = q.size();
    for (long long i = 0; i < siz; i++) {
      cent = q.front();
      q.pop();
      for (long long v : adj[cent]) {
        deg[v]--;
        if (deg[v] == 1) q.push(v);
      }
    }
    if (!q.empty())
      dia += 2;
    else if (siz == 2)
      dia++;
  }
  dicent.push_back({dia, cent});
}
long long getDia(long long src) {
  queue<long long> q;
  memset(vis, false, sizeof(vis));
  q.push(src);
  long long u, v1, dia = 0;
  while (!q.empty()) {
    u = q.front();
    q.pop();
    vis[u] = true;
    for (long long v : adj[u])
      if (!vis[v]) q.push(v);
  }
  memset(vis, false, sizeof(vis));
  q.push(u);
  while (!q.empty()) {
    long long siz = q.size();
    while (siz--) {
      u = q.front();
      q.pop();
      vis[u] = true;
      for (long long v : adj[u])
        if (!vis[v]) q.push(v);
    }
    if (!q.empty()) dia++;
  }
  return dia;
}
int main() {
  long long n, m, i, u, v;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
    deg[u]++;
    deg[v]++;
  }
  for (i = 1; i <= n; i++) {
    if (!vis[i]) solve(i);
  }
  sort((dicent).begin(), (dicent).end(), greater<pair<long long, long long>>());
  for (i = 1; i < dicent.size(); i++) {
    adj[dicent[0].second].push_back(dicent[i].second);
    adj[dicent[i].second].push_back(dicent[0].second);
  }
  cout << getDia(1) << "\n";
  for (i = 1; i < dicent.size(); i++)
    cout << dicent[0].second << " " << dicent[i].second << "\n";
  return 0;
}
