#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
pair<long long, long long> grp[N];
long long a[N], b[N], p[N], cnt[N], s[N];
bool chk[N];
long long find_set(long long u) {
  if (p[u] < 0) return u;
  return p[u] = find_set(p[u]);
}
bool dsu(long long u, long long v) {
  u = find_set(u);
  v = find_set(v);
  cnt[u]++;
  if (u == v) return 0;
  if (p[u] < p[v]) swap(u, v);
  long long tmp[4] = {grp[u].first, grp[v].first, grp[u].second, grp[v].second};
  sort(tmp, tmp + 4);
  s[u] += s[v];
  grp[u] = {tmp[2], tmp[3]};
  p[u] += p[v];
  cnt[u] += cnt[v];
  p[v] = u;
  return 1;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  if (fopen("A.inp", "r")) {
    freopen("test.inp", "r", stdin);
    freopen("test.out", "w", stdout);
  }
  long long n;
  cin >> n;
  vector<long long> val;
  for (int i = 1; i <= n; i++) {
    cin >> a[i] >> b[i];
    val.push_back(a[i]);
    val.push_back(b[i]);
  }
  sort(val.begin(), val.end());
  val.resize(unique(val.begin(), val.end()) - val.begin());
  memset(p, -1, sizeof(p));
  for (int i = 1; i <= val.size(); i++) grp[i].second = i, s[i] = 1;
  for (int i = 1; i <= n; i++) {
    a[i] = lower_bound(val.begin(), val.end(), a[i]) - val.begin() + 1;
    b[i] = lower_bound(val.begin(), val.end(), b[i]) - val.begin() + 1;
    dsu(a[i], b[i]);
  }
  long long ans = 0;
  for (int i = 1; i <= val.size(); i++) {
    long long id = find_set(i);
    if (chk[id]) continue;
    if (cnt[id] > s[id]) return cout << -1, 0;
    if (cnt[id] != s[id])
      ans = max(ans, val[grp[id].first - 1]);
    else
      ans = max(ans, val[grp[id].second - 1]);
    chk[id] = 1;
  }
  cout << ans;
}
