#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int n, m;
namespace BCC {
const int N = 202020;
vector<int> bcc[N];
vector<int> k;
int cnt, dfn[N], low[N], id[N], st[N], _st, _, to[N];
void dfs(int c, int dep, vector<int> g[]) {
  int cc = 0;
  st[_st++] = c;
  dfn[c] = low[c] = dep;
  for (auto t : g[c]) {
    if (!dfn[t]) {
      dfs(t, dep + 1, g);
      low[c] = min(low[c], low[t]);
    } else if (dfn[t] != dfn[c] - 1 || cc++)
      low[c] = min(low[c], dfn[t]);
  }
  if (low[c] == dfn[c]) {
    to[_] = st[_st - 1];
    do {
      id[st[--_st]] = _;
    } while (st[_st] != c);
    _++;
  }
}
int solve(int n, vector<int> g[]) {
  cnt = 0;
  fill_n(dfn, n, _ = 0);
  fill_n(low, n, _st = 0);
  fill_n(bcc, n, vector<int>());
  for (int i = (0); i < (n); i++)
    if (!dfn[i]) dfs(i, 1, g), cnt++;
  for (int i = (0); i < (n); i++)
    for (auto j : g[i])
      if (id[i] != id[j]) bcc[id[i]].push_back(id[j]);
  return cnt;
}
}  // namespace BCC
vector<int> g[N];
int main() {
  cin >> n >> m;
  if (n == 2) {
    cout << -1;
    return 0;
  }
  for (int i = (1); i < (m + 1); i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  BCC::solve(n, g);
  int leaf = 0;
  vector<int> s;
  for (int i = (0); i < (BCC::_); i++) {
    if ((int)BCC::bcc[i].size() == 1) leaf++, s.push_back(BCC::to[i] + 1);
  }
  int ans = (leaf + 1) / 2;
  cout << ans << "\n";
  if (leaf & 1) ans--;
  for (int i = ans; i <= leaf - 1; ++i)
    cout << s[i] << " " << s[i - ans] << "\n";
  return 0;
}
