#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rm(int l, int r) {
  uniform_int_distribution<int> dis(l, r);
  return dis(rng);
}
using ulli = unsigned long long;
using lli = long long;
using ld = long double;
using ii = pair<int, int>;
using vi = vector<int>;
int n, m;
const int N = 1e5 + 5;
int main() {
  scanf("%d %d", &n, &m);
  vector<set<int>> orig(n + 1);
  for (auto i = (0) - ((0) > (m)); i != m - ((0) > (m));
       i += 1 - 2 * ((0) > (m))) {
    int u, v;
    scanf("%d %d", &u, &v);
    orig[u].insert(v);
    orig[v].insert(u);
  }
  bool sol = false;
  vector<pair<int, int>> edges;
  for (auto it = (0) - ((0) > (180)); it != 180 - ((0) > (180));
       it += 1 - 2 * ((0) > (180))) {
    vector<set<int>> graph(n + 1);
    int cnt = 0;
    for (auto i = (0) - ((0) > (m)); i != m - ((0) > (m));
         i += 1 - 2 * ((0) > (m))) {
      int u = rm(1, n);
      int it2 = 4 * n;
      while (it2-- && int(graph[u].size()) == 2) u = rm(1, n);
      if (int(graph[u].size()) == 2) break;
      int v = rm(1, n);
      while (it2-- && (u == v || int(graph[v].size()) == 2 ||
                       orig[u].count(v) || graph[u].count(v)))
        v = rm(1, n);
      if (u == v || int(graph[v].size()) == 2 || orig[u].count(v) ||
          graph[u].count(v))
        break;
      ++cnt;
      graph[u].insert(v);
      graph[v].insert(u);
    }
    if (cnt == m) {
      for (auto u = (1) - ((1) > (n + 1)); u != n + 1 - ((1) > (n + 1));
           u += 1 - 2 * ((1) > (n + 1)))
        for (int v : graph[u])
          if (u < v) edges.push_back({u, v});
      for (auto e : edges) printf("%d %d\n", e.first, e.second);
      sol = true;
      break;
    }
  }
  if (!sol) printf("%d\n", -1);
  return 0;
}
