#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
const int N = 2e5;
set<int> g[N];
int degree[N], from[N], to[N];
set<pair<int, int> > s;
void noSolution() {
  cout << "-1";
  exit(0);
}
void addEdge(int f, int t, int index) {
  s.erase(make_pair(degree[f], f));
  s.erase(make_pair(degree[t], t));
  s.insert(make_pair(++degree[f], f));
  s.insert(make_pair(++degree[t], t));
  g[f].insert(t);
  g[t].insert(f);
  from[index] = f;
  to[index] = t;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<pair<pair<int, int>, int> > v(m);
  for (int i = 0; i < m; ++i) {
    cin >> v[i].first.first >> v[i].first.second;
    v[i].first.second = 1 - v[i].first.second;
    v[i].second = i;
  }
  sort(v.begin(), v.end());
  s.insert(make_pair(0, 1));
  int last = 1;
  for (int i = 0; i < m; ++i) {
    int index = v[i].second;
    if (v[i].first.second) {
      int v = s.begin()->second;
      if (degree[v] + 1 >= last) noSolution();
      int tl = 0;
      if (g[v].empty()) {
        addEdge(v, v == 1 ? 2 : 1, index);
      } else {
        bool ok = false;
        for (set<int>::iterator it = g[v].begin(); it != g[v].end(); ++it) {
          int next = (*it) - 1;
          if (next != tl && next != v) {
            ok = true;
            addEdge(next, v, index);
            break;
          }
          tl = (*it);
        }
        if (!ok) {
          int next = tl + 1;
          if (v == next) ++next;
          addEdge(next, v, index);
        }
      }
    } else {
      addEdge(last, last + 1, index);
      ++last;
    }
  }
  for (int i = 0; i < m; ++i) cout << from[i] << ' ' << to[i] << endl;
}
