#include <bits/stdc++.h>
using namespace std;
struct Node {
  int val;
  int type;
  int id;
} node[100005];
int n, m;
struct Edge {
  int u;
  int v;
} edge[100005];
int flag = 0;
bool cmp(const Node &a, const Node &b) {
  if (a.val != b.val)
    return a.val < b.val;
  else
    return a.type > b.type;
}
void input() {
  int sum = 0;
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &node[i].val, &node[i].type);
    node[i].id = i;
  }
  sort(node, node + m, cmp);
}
void solve() {
  int start = 1, en = 3;
  int start_n = 1;
  for (int i = 0; i < m; i++) {
    if (node[i].type == 1) {
      edge[node[i].id].u = start_n;
      edge[node[i].id].v = start_n + 1;
      start_n++;
    } else {
      if (en > start_n) {
        puts("-1");
        flag = 1;
        return;
      }
      if (en - start > 1) {
        edge[node[i].id].u = start;
        edge[node[i].id].v = en;
        start++;
      } else {
        en++;
        if (en > start_n) {
          flag = 1;
          puts("-1");
          return;
        }
        start = 1;
        edge[node[i].id].u = start;
        edge[node[i].id].v = en;
        start++;
      }
    }
  }
}
void print() {
  for (int i = 0; i < m; i++) {
    printf("%d %d\n", edge[i].u, edge[i].v);
  }
}
int main() {
  while (scanf("%d %d\n", &n, &m) == 2) {
    flag = 0;
    input();
    solve();
    if (!flag) print();
  }
}
