#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
class Solution {
  int n, m;
  struct Edge {
    int u, v, id;
    long long l;
    bool isOn;
    Edge(long long l, int id, int isOn) : l(l), id(id), isOn(isOn) {}
  };
  vector<Edge> V;

 public:
  void run() {
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
      int a, b;
      cin >> a >> b;
      V.emplace_back(a, i, b);
    }
    sort(V.begin(), V.end(), [](Edge a, Edge b) {
      return make_pair(a.l, !a.isOn) < make_pair(b.l, !b.isOn);
    });
    vector<pair<int, int>> unused;
    int cur = 1;
    for (Edge &e : V) {
      if (e.isOn) {
        tie(e.u, e.v) = make_pair(cur, cur + 1);
        ++cur;
        for (int i = 1; unused.size() < 1e6 and i < cur - 1; ++i) {
          unused.emplace_back(i, cur);
        }
      } else {
        if (unused.empty()) {
          cout << -1 << '\n';
          return;
        }
        tie(e.u, e.v) = unused.back();
        unused.pop_back();
      }
    }
    sort(V.begin(), V.end(), [](Edge a, Edge b) { return a.id < b.id; });
    for (Edge &e : V) {
      cout << e.u << ' ' << e.v << '\n';
    }
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  Solution().run();
}
