#include <bits/stdc++.h>
using namespace std;
int tamG;
vector<int> g[4 * 1000010], gt[4 * 1000010];
int componente[4 * 1000010];
stack<int> kosaraju_pilha;
int visitado[4 * 1000010], numSCC, n, maior_possivel = -0x3f3f3f3f;
pair<int, int> dias[1000010];
void kosaraju_dfs1(int v) {
  visitado[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    int u = g[v][i];
    if (!visitado[u]) kosaraju_dfs1(u);
  }
  kosaraju_pilha.push(v);
}
void kosaraju_dfs2(int v) {
  visitado[v] = true;
  for (int i = 0; i < gt[v].size(); i++) {
    int u = gt[v][i];
    if (!visitado[u]) kosaraju_dfs2(u);
  }
  componente[v] = numSCC;
}
void kosaraju() {
  numSCC = 0;
  memset(visitado, 0, sizeof visitado);
  for (int i = 0; i < tamG; i++)
    if (!visitado[i]) kosaraju_dfs1(i);
  memset(visitado, 0, sizeof visitado);
  while (!kosaraju_pilha.empty()) {
    int v = kosaraju_pilha.top();
    kosaraju_pilha.pop();
    if (!visitado[v]) kosaraju_dfs2(v), numSCC++;
  }
}
bool twosat() {
  kosaraju();
  for (int i = 0; i < tamG; i += 2) {
    if (componente[i] == componente[i + 1]) return false;
  }
  return true;
}
int idVerdade(int p1) { return p1 * 2 + 1; }
int idFalso(int p1) { return p1 * 2; }
void addAresta(int p1, int p2) {
  g[p1].push_back(p2);
  gt[p2].push_back(p1);
}
bool check(int a) {
  map<int, vector<int> > pessoas;
  for (int i = 0; i < 4 * n; i++) {
    g[i].clear();
    gt[i].clear();
  }
  for (int i = 0; i < n; i++) {
    int v1 = dias[i].first;
    int v2 = dias[i].second;
    addAresta(idFalso(i * 2), idVerdade(i * 2 + 1));
    addAresta(idFalso(i * 2 + 1), idVerdade(i * 2));
    if (v2 > a) {
      addAresta(idVerdade(i * 2 + 1), idFalso(i * 2 + 1));
    }
    vector<int> &v = pessoas[v1];
    for (int j = 0; j < v.size(); j++) {
      int u1 = dias[v[j]].first;
      int u2 = dias[v[j]].second;
      if (v1 == u2) {
        addAresta(idVerdade(i * 2), idFalso(j * 2 + 1));
        addAresta(idVerdade(j * 2 + 1), idFalso(i * 2));
      }
      if (v1 == u1) {
        addAresta(idVerdade(i * 2), idFalso(j * 2));
        addAresta(idVerdade(j * 2), idFalso(i * 2));
      }
      if (v2 == u2) {
        addAresta(idVerdade(i * 2 + 1), idFalso(j * 2 + 1));
        addAresta(idVerdade(j * 2 + 1), idFalso(i * 2 + 1));
      }
      if (v2 == u1) {
        addAresta(idVerdade(i * 2 + 1), idFalso(j * 2));
        addAresta(idVerdade(j * 2), idFalso(i * 2 + 1));
      }
    }
    v.push_back(i);
    vector<int> &ve = pessoas[v2];
    for (int j = 0; j < ve.size(); j++) {
      int u1 = dias[ve[j]].first;
      int u2 = dias[ve[j]].second;
      if (v1 == u2) {
        addAresta(idVerdade(i * 2), idFalso(j * 2 + 1));
        addAresta(idVerdade(j * 2 + 1), idFalso(i * 2));
      }
      if (v1 == u1) {
        addAresta(idVerdade(i * 2), idFalso(j * 2));
        addAresta(idVerdade(j * 2), idFalso(i * 2));
      }
      if (v2 == u2) {
        addAresta(idVerdade(i * 2 + 1), idFalso(j * 2 + 1));
        addAresta(idVerdade(j * 2 + 1), idFalso(i * 2 + 1));
      }
      if (v2 == u1) {
        addAresta(idVerdade(i * 2 + 1), idFalso(j * 2));
        addAresta(idVerdade(j * 2), idFalso(i * 2 + 1));
      }
    }
    pessoas[v2].push_back(i);
  }
  return !twosat();
}
int lower_bound(int a, int b) {
  int meio = (a + b) / 2LL;
  if (a == b) return a;
  if (check(meio)) {
    return lower_bound(meio + 1LL, b);
  } else {
    return lower_bound(a, meio);
  }
}
int main() {
  scanf(" %d", &n);
  tamG = 4 * n;
  int menor_possivel = 0x3f3f3f3f;
  for (int i = 0; i < n; i++) {
    scanf(" %d %d", &dias[i].first, &dias[i].second);
    menor_possivel = min(dias[i].first, menor_possivel);
    maior_possivel = max(dias[i].second, maior_possivel);
  }
  int sol = lower_bound(menor_possivel, maior_possivel + 1);
  if (sol == maior_possivel + 1)
    printf("-1\n");
  else
    printf("%d\n", sol);
}
