#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int maxn = (int)1e5;
int used[maxn];
int current[maxn];
int cnt;
vector<vector<int> > es;
void dfs(int v) {
  current[cnt++] = v;
  used[v] = 1;
  for (int it = 0; it < ((int)(es[v]).size()); ++it) {
    int u = es[v][it];
    if (used[u]) continue;
    dfs(u);
  }
}
vector<vector<int> > pieces;
void addStripes(const vector<vector<int> > &stripes, int &r, int mod,
                int &cnt) {
  int sum = 0;
  for (int i = 0; i < ((int)(stripes).size()); ++i)
    sum += ((int)(stripes[i]).size());
  for (int i = 0, inside = 0; i < ((int)(stripes).size()); ++i) {
    for (int j = 0; j < ((int)(stripes[i]).size()); ++j) {
      int cur = stripes[i][j];
      pieces[r].push_back(cur);
      ++inside;
      if ((j == ((int)(stripes[i]).size()) - 1) || (sum - inside) < mod) {
        r = (r == mod - 1 ? 0 : (r + 1));
        ++cnt;
        ++sum;
      }
    }
  }
}
vector<int> getStripe(int n, int *current) {
  vector<int> result;
  for (int i = n / 2; i < n; ++i) {
    result.push_back(current[i]);
    if (i == n - 1 && (n & 1)) continue;
    if (i == n / 2)
      result.push_back(current[0]);
    else
      result.push_back(current[n - (n & 1) - i]);
  }
  return result;
}
bool solve() {
  int n, m;
  if (scanf("%d%d", &n, &m) < 2) return 0;
  es = vector<vector<int> >(n);
  for (int i = 0; i < m; ++i) {
    int s, t;
    scanf("%d%d", &s, &t);
    --s, --t;
    es[s].push_back(t), es[t].push_back(s);
  }
  memset(used, 0, sizeof(used[0]) * n);
  vector<vector<vector<int> > > stripes;
  for (int i = 0; i < n; ++i) {
    if (used[i] || ((int)(es[i]).size()) != 1) continue;
    cnt = 0;
    dfs(i);
    vector<vector<int> > some;
    if (cnt >= 4 || cnt == 1) {
      some.push_back(getStripe(cnt, current));
    } else {
      for (int odd = 0; odd < 2; ++odd) {
        vector<int> stripe;
        for (int i = odd; i < cnt; i += 2) stripe.push_back(current[i]);
        some.push_back(stripe);
      }
    }
    stripes.push_back(some);
  }
  for (int i = 0; i < n; ++i) {
    if (used[i]) continue;
    cnt = 0;
    dfs(i);
    assert(cnt != 2);
    vector<vector<int> > some;
    if (cnt == 1 || cnt == 3) {
      for (int i = 0; i < cnt; ++i) some.push_back(vector<int>(1, current[i]));
    } else if (cnt == 4) {
      for (int odd = 0; odd < 2; ++odd) {
        vector<int> stripe;
        for (int i = odd; i < cnt; i += 2) stripe.push_back(current[i]);
        some.push_back(stripe);
      }
    } else {
      assert(cnt >= 5);
      some.push_back(getStripe(cnt, current));
    }
    stripes.push_back(some);
  }
  int head = 0;
  for (int i = 1; i < ((int)(stripes).size()); ++i) {
    if (((int)(stripes[i]).size()) > ((int)(stripes[head]).size())) head = i;
  }
  int mod = ((int)(stripes[head]).size());
  pieces = vector<vector<int> >(mod);
  for (int i = 0; i < mod; ++i) {
    for (int j = 0; j < ((int)(stripes[head][i]).size()); ++j)
      pieces[i].push_back(stripes[head][i][j]);
  }
  int r = 0, cnt = 0;
  for (int i = 0; i < ((int)(stripes).size()); ++i) {
    if (i == head) continue;
    addStripes(stripes[i], r, mod, cnt);
  }
  int countPieces = n - m;
  if (countPieces == 0) {
    if (cnt < mod && !(mod == 1 && ((int)(pieces[0]).size()) >= 5)) {
      printf("-1\n");
      return 1;
    }
    int last = -1;
    for (int i = 0; i < mod; ++i) {
      for (int j = 0; j < ((int)(pieces[i]).size()); ++j) {
        int cur = pieces[i][j];
        if (last != -1) printf("%d %d\n", last + 1, cur + 1);
        last = cur;
      }
    }
    printf("%d %d\n", last + 1, pieces[0][0] + 1);
    return 1;
  }
  if (cnt < mod - countPieces) {
    printf("-1\n");
    return 1;
  }
  vector<int> all;
  for (int i = 0; i < mod; ++i) {
    for (int j = 0; j < ((int)(pieces[i]).size()); ++j) {
      all.push_back(pieces[i][j]);
    }
  }
  int leftPieces = 1;
  vector<bool> tocut(n - 1, 0);
  for (int i = mod - 2, pos = n; i >= cnt; --i) {
    pos -= ((int)(pieces[i + 1]).size());
    assert(pos > 0);
    tocut[pos - 1] = 1, ++leftPieces;
  }
  assert(leftPieces <= countPieces);
  for (int i = 0; leftPieces < countPieces && i < n - 1; ++i)
    if (!tocut[i]) tocut[i] = 1, ++leftPieces;
  assert(leftPieces == countPieces);
  for (int i = 0; i < n - 1; ++i) {
    if (!tocut[i]) printf("%d %d\n", all[i] + 1, all[i + 1] + 1);
  }
  return 1;
}
int main() {
  srand(rdtsc());
  while (1) {
    if (!solve()) break;
  }
  return 0;
}
