#include <bits/stdc++.h>
using namespace std;
inline void pisz(int n) { printf("%d\n", n); }
const int dr[4] = {-1, 0, 1, 0};
const int dc[4] = {0, -1, 0, 1};
const int drr[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dcc[8] = {0, -1, -1, -1, 0, 1, 1, 1};
template <typename T, typename TT>
ostream& operator<<(ostream& s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream& operator<<(ostream& s, vector<T> t) {
  for (int i = 0; i < ((int)((t).size())); i++) s << t[i] << " ";
  return s;
}
class UnionFind {
 private:
  vector<int> rank, p;

 public:
  UnionFind(int n) {
    for (int i = 0; i < n; i++) p.push_back(i);
    rank.assign(n, 0);
  }
  int findSet(int s) { return (p[s] == s) ? s : (p[s] = findSet(p[s])); }
  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }
  void unionSet(int i, int j) {
    if (isSameSet(i, j)) return;
    int x = findSet(i), y = findSet(j);
    if (rank[x] > rank[y])
      p[y] = x;
    else {
      p[x] = y;
      if (rank[x] == rank[y]) rank[y]++;
    }
  }
};
bool fcomp(double A, double B) {
  double EPSILON = numeric_limits<double>::epsilon();
  double diff = A - B;
  return fabs(diff) < EPSILON;
}
double x_y(int x1, int y1, int x2, int y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int main() {
  int(n);
  scanf("%d", &(n));
  vector<pair<int, int> > dt(n), ans;
  string s[n];
  for (int i = 0; i < n; i++) {
    cin >> s[i] >> dt[i].first;
    dt[i].second = i;
  }
  sort((dt).begin(), (dt).end());
  int ys = 1;
  if (dt[0].first != 0) ys = 0;
  ans.push_back({1e6, 0});
  for (int i = 1; i < n; i++) {
    sort((ans).begin(), (ans).end());
    reverse((ans).begin(), (ans).end());
    if (dt[i].first > i) {
      ys = 0;
      break;
    }
    int nw = ans[0].first + 1;
    if (dt[i].first) {
      nw = ans[dt[i].first - 1].first - 1;
    }
    ans.push_back({nw, i});
    sort((ans).begin(), (ans).end());
    for (int j = 0; j < ans.size() - 1; j++) {
      if (ans[j].first == ans[j + 1].first) {
        for (int k = j + 1; k < ans.size(); k++) {
          ans[k].first++;
        }
        break;
      }
    }
  }
  if (!ys) {
    printf("-1\n");
    return 0;
  }
  int res[n];
  for (int i = 0; i < ans.size(); i++) {
    res[ans[i].second] = ans[i].first;
  }
  for (int i = 0; i < n; i++) {
    cout << s[dt[i].second] << " " << res[i] << endl;
  }
  return 0;
}
