#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2")
using namespace std;
long long fastexp(long long a, long long n, long long nod = LLONG_MAX) {
  long long ans = 1;
  while (n) {
    if (n & 1) ans = (ans * a) % nod;
    a = (a * a) % nod;
    n >>= 1;
  }
  return ans;
}
struct node {
  int w;
  int mst;
  int index;
};
bool comp(node &A, node &B) {
  if (A.w != B.w) return A.w < B.w;
  return A.mst > B.mst;
}
void fun() {
  int n, m;
  cin >> n >> m;
  vector<node> v(m);
  vector<pair<int, int>> ans(m);
  for (int i = 0; i < m; i++) {
    cin >> v[i].w >> v[i].mst;
    v[i].index = i;
  }
  sort(v.begin(), v.end(), comp);
  int curnode = 1;
  int maker = 3, makel = 1;
  for (int i = 0; i < m; i++) {
    int a, b;
    if (!v[i].mst) {
      if (maker > curnode) {
        cout << "-1\n";
        return;
      }
      a = maker;
      b = makel;
      makel--;
      if (makel == 0) {
        maker++;
        makel = maker - 2;
      }
    } else {
      a = curnode;
      b = curnode + 1;
      curnode++;
    }
    int ind = v[i].index;
    ans[ind].first = a;
    ans[ind].second = b;
  }
  for (int i = 0; i < m; i++) {
    cout << ans[i].first << " " << ans[i].second << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cout.precision(20);
  cout << fixed;
  int t = 1;
  while (t--) {
    fun();
  }
}
