#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 2;
int n, a[N], b[N], cntv, cnte;
bool used[N * 2], was[2][N];
vector<int> vec, g[N * 2];
void dfs(int v) {
  used[v] = 1;
  cntv++;
  cnte += g[v].size();
  for (int to : g[v]) {
    if (!used[to]) {
      dfs(to);
    }
  }
}
bool check(int x) {
  for (int i = 1; i < vec.size(); i++) {
    used[i] = 0;
    g[i].clear();
  }
  for (int i = 1; i <= n; i++) {
    was[0][i] = was[1][i] = 0;
    if (x < b[i]) {
      if (used[a[i]]) return 0;
      was[0][i] = 1;
      used[a[i]] = 1;
    }
  }
  bool ok = 1;
  while (ok) {
    ok = 0;
    for (int i = 1; i <= n; i++) {
      if (used[a[i]] && used[b[i]]) return 0;
      if (was[0][i] + was[1][i] == 0 && (used[a[i]] + used[b[i]] != 0)) {
        ok = 1;
        if (used[a[i]]) {
          used[a[i]] = 1;
          was[0][i] = 1;
        } else {
          used[b[i]] = 1;
          was[1][i] = 1;
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (was[0][i] + was[1][i] == 0) {
      g[a[i]].push_back(b[i]), g[b[i]].push_back(a[i]);
      used[a[i]] = used[b[i]] = 0;
    }
  }
  for (int i = 1; i <= x; i++) {
    if (!used[i]) {
      cntv = cnte = 0;
      dfs(i);
      if (cntv * 2 < cnte) return 0;
    }
  }
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", &a[i], &b[i]);
    vec.push_back(a[i]);
    vec.push_back(b[i]);
  }
  vec.push_back(0);
  sort(vec.begin(), vec.end());
  int lo = 0, hi = vec.size() - 1;
  for (int i = 1; i <= n; i++) {
    a[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin();
    b[i] = lower_bound(vec.begin(), vec.end(), b[i]) - vec.begin();
    lo = max(lo, a[i]);
  }
  if (!check(hi)) {
    puts("-1");
    return 0;
  }
  while (lo < hi) {
    int md = (lo + hi) >> 1;
    if (check(md))
      hi = md;
    else
      lo = md + 1;
  }
  cout << vec[lo] << endl;
}
