#include <bits/stdc++.h>
using namespace std;
struct Arbol {
  long long int raiz, valor;
  bool operator<(const Arbol& otro) const { return valor < otro.valor; }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long int n;
  cin >> n;
  vector<long long int> padres(n - 1);
  vector<long long int> apariciones(n, 0);
  for (long long int i = 0; i < n - 1; i++) {
    cin >> padres[i];
    padres[i]--;
    apariciones[padres[i]]++;
  }
  set<Arbol> arboles;
  for (long long int i = 0; i < apariciones.size(); i++) {
    if (apariciones[i] == 0) {
      arboles.insert(Arbol{i, i});
    }
  }
  vector<long long int> valores(n, -1);
  vector<pair<long long int, long long int>> edges;
  for (long long int i = padres.size() - 1; i >= 0; i--) {
    long long int padre_actual = padres[i];
    auto it_arbol_mas_chico = arboles.begin();
    edges.push_back({padre_actual, it_arbol_mas_chico->raiz});
    long long int valor = max(padre_actual, it_arbol_mas_chico->valor);
    valores[it_arbol_mas_chico->raiz] = -1;
    arboles.erase(it_arbol_mas_chico);
    if (valores[padre_actual] != -1) {
      valor = max(valor, valores[padre_actual]);
      arboles.erase(Arbol{padre_actual, valores[padre_actual]});
    }
    apariciones[padre_actual]--;
    if (apariciones[padre_actual] == 0) {
      arboles.insert(Arbol{padre_actual, valor});
      valores[padre_actual] = valor;
    }
  }
  cout << padres[0] + 1 << '\n';
  for (long long int i = 0; i < edges.size(); i++) {
    cout << edges[i].first + 1 << " " << edges[i].second + 1 << '\n';
  }
  return 0;
}
