#include <bits/stdc++.h>
using namespace std;
const int M = 1e5 + 20;
int cnt[M], epar[M], par[M], res, comp[M], k, t, st[M];
vector<pair<int, int> > adj[M];
vector<pair<int, int> > leaf;
vector<int> ans[M];
vector<int> adj2[M];
bool mark[M], visit[M], boreshi[M], ham[M], barg[M], ham2[M];
int n, m;
void dfs(int u) {
  mark[u] = true;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i].first;
    int e = adj[u][i].second;
    if (!mark[v]) {
      par[v] = u;
      visit[e] = true;
      epar[v] = e;
      dfs(v);
      cnt[u] += cnt[v];
    } else {
      if (v != par[u] && !visit[e]) {
        cnt[u]++;
        cnt[v]--;
        visit[e] = true;
      }
    }
  }
}
void doha(int u) {
  mark[u] = true;
  comp[u] = res;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i].first;
    int e = adj[u][i].second;
    if (!mark[v] && !boreshi[e]) {
      doha(v);
    }
  }
}
void dfs2(int u) {
  st[u] = t++;
  mark[u] = true;
  for (int i = 0; i < adj2[u].size(); i++) {
    int v = adj2[u][i];
    if (!mark[v]) {
      dfs2(v);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[u].push_back({v, i});
    adj[v].push_back({u, i});
  }
  if (n == 2) {
    cout << "-1\n";
    return 0;
  }
  dfs(0);
  for (int i = 1; i < n; i++) {
    if (cnt[i] == 0) {
      boreshi[epar[i]] = true;
    }
  }
  fill(mark, mark + M, 0);
  fill(visit, visit + M, 0);
  for (int i = 0; i < n; i++) {
    if (!mark[i]) {
      doha(i);
      res++;
    }
  }
  if (res == 1) {
    cout << "0\n";
    return 0;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < adj[i].size(); j++) {
      int v = adj[i][j].first;
      if (comp[i] != comp[v]) adj2[comp[i]].push_back(comp[v]);
    }
  }
  fill(mark, mark + M, 0);
  dfs2(0);
  for (int i = 0; i < res; i++) {
    if (adj2[i].size() == 1) leaf.push_back({st[i], i});
  }
  sort(leaf.begin(), leaf.end());
  k = leaf.size();
  cout << (k + 1) / 2 << "\n";
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < n; j++) {
      if (comp[j] == leaf[i].second) {
        barg[j] = true;
        ans[i].push_back(j);
      }
    }
  }
  for (int i = 0; i < adj[ans[k - 1][0]].size(); i++)
    ham[adj[ans[k - 1][0]][i].first] = true;
  for (int i = 0; i < adj[ans[0][0]].size(); i++)
    ham2[adj[ans[0][0]][i].first] = true;
  if (k == 2) {
    for (int i = 0; i < n; i++) {
      if (ans[0][0] != i && !ham2[i] && barg[i] && comp[i] != comp[ans[0][0]]) {
        cout << i + 1 << " " << ans[0][0] + 1 << "\n";
        return 0;
      }
    }
  }
  if (k % 2 == 0) {
    for (int i = 0; i < k / 2; i++) {
      cout << ans[i][0] + 1 << " " << ans[i + (k / 2)][0] + 1 << "\n";
    }
  } else {
    for (int i = 0; i < (k - 1) / 2; i++) {
      cout << ans[i][0] + 1 << " " << ans[i + (k - 1) / 2][0] + 1 << "\n";
    }
    for (int i = 0; i < n; i++) {
      if (ans[k - 1][0] != i && !ham[i] && barg[i] &&
          comp[i] != comp[ans[k - 1][0]]) {
        cout << i + 1 << " " << ans[k - 1][0] + 1 << "\n";
        break;
      }
    }
  }
  return 0;
}
