#include <bits/stdc++.h>
#pragma GCC optimize("O3")
const double PI = acos(-1);
template <class A, class B>
std::ostream& operator<<(std::ostream& st, const std::pair<A, B> p) {
  st << "(" << p.first << ", " << p.second << ")";
  return st;
}
using namespace std;
const int MAX = 200 * 1000 + 10;
int out_deg[MAX];
std::vector<int> ord;
int n;
bool taken[MAX];
int main() {
  scanf("%d", &n);
  if (n == 1) {
    puts("1");
    return 0;
  }
  for (int i = 0; i < (n - 1); i++) {
    int x;
    scanf("%d", &x);
    out_deg[x]++;
    ord.push_back(x);
  }
  set<std::pair<int, int> > S;
  for (int u = 1; u <= n; u++)
    if (!out_deg[u]) S.emplace(u, u);
  int R = ord[0];
  printf("%d\n", R);
  while (!ord.empty()) {
    int u = ord.back();
    ord.pop_back();
    std::pair<int, int> p = *S.begin();
    S.erase(S.begin());
    int val = max(u, p.first);
    int v = p.second;
    printf("%d %d\n", u, v);
    out_deg[u]--;
    if (!out_deg[u]) S.emplace(val, u);
  }
  return 0;
}
