#include <bits/stdc++.h>
using namespace std;
int mineq(int &a, int b) { return a > b ? a = b, true : false; }
int maxeq(int &a, int b) { return a < b ? a = b, true : false; }
const int MAXN = 1e5 + 10;
struct edge {
  int w, id;
  bool b;
};
edge e[MAXN];
int n, m;
pair<int, int> a[MAXN];
pair<int, int> ans[MAXN];
bool cmp(const edge &a, const edge &b) {
  return a.w == b.w ? a.b > b.b : a.w < b.w;
}
void kruskal() {
  sort(e, e + m, cmp);
  int cur = 1;
  int num = 1;
  for (int i = 0; i < (int)m; i++) {
    int id = e[i].id;
    if (e[i].b == true) {
      ans[id] = make_pair(num, num + 1);
      num++;
    } else {
      if (a[cur].first > num || a[cur].first == 0) {
        printf("-1");
        exit(0);
      }
      ans[id] = make_pair(a[cur].first, a[cur].second);
      cur++;
    }
  }
  return;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)m; i++) {
    scanf("%d%d", &e[i].w, &e[i].b);
    e[i].id = i;
  }
  int cnt = 0;
  for (int i = 1; i < (int)n + 1; i++) {
    for (int j = 1; j < (int)i - 1; j++) {
      cnt++;
      a[cnt] = make_pair(i, j);
      if (cnt == m) break;
    }
    if (cnt == m) break;
  }
  kruskal();
  for (int i = 0; i < (int)m; i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
