#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 2;
int n, a[N], b[N], cntv, cnte;
bool used[N * 2], exam[N];
vector<int> vec;
vector<pair<int, int> > g[N * 2];
void dfs(int v) {
  used[v] = 1;
  cntv++;
  cnte += g[v].size();
  for (auto to : g[v]) {
    if (!used[to.first]) {
      dfs(to.first);
    }
  }
}
bool ok(int v) {
  if (used[v]) return false;
  used[v] = 1;
  for (auto i : g[v]) {
    int to = i.first;
    int ex = i.second;
    if (exam[ex]) continue;
    exam[ex] = 1;
    if (!ok(to)) return false;
  }
  return true;
}
bool check(int x) {
  memset(used, 0, sizeof(used));
  memset(exam, 0, sizeof(exam));
  for (int i = x + 1; i < vec.size(); i++) {
    if (!ok(i)) return 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());
  vec.resize(unique(vec.begin(), vec.end()) - vec.begin());
  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();
    g[a[i]].push_back({b[i], i});
    g[b[i]].push_back({a[i], i});
    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;
}
