#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
const int MOD = 1000000007;
const int maxn = 2000005;
map<int, int> id;
int idx[maxn];
int ID(int x) {
  if (id.count(x)) {
    return id[x];
  } else {
    id[x] = id.size();
    idx[id[x]] = x;
    return id[x];
  }
}
int m, n;
int fa[maxn], ec[maxn], pc[maxn], ma1[maxn], ma2[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void merge(int u, int v) {
  int fu = find(u), fv = find(v);
  if (fu == fv) return;
  fa[fu] = fv;
}
vector<pair<int, int> > edge;
int main() {
  while (~scanf("%d", &m)) {
    id.clear();
    edge.clear();
    for (int i = 0; i < m * 2; ++i) fa[i] = i;
    for (int i = 0; i < m; ++i) {
      int u, v;
      scanf("%d%d", &u, &v);
      u = ID(u);
      v = ID(v);
      merge(u, v);
      edge.push_back({u, v});
    }
    n = id.size();
    int ans = 0;
    memset(ma1, 0, sizeof(ma1));
    memset(ma2, 0, sizeof(ma2));
    memset(pc, 0, sizeof(pc));
    memset(ec, 0, sizeof(ec));
    for (int i = 0; i < m; ++i) {
      ec[find(edge[i].first)]++;
    }
    for (int i = 0; i < n; ++i) {
      int p = find(i);
      pc[p]++;
      ma2[p] = max(ma2[p], idx[i]);
      if (ma2[p] > ma1[p]) swap(ma2[p], ma1[p]);
    }
    for (int i = 0; i < n; ++i)
      if (fa[i] == i) {
        if (pc[i] == ec[i])
          ans = max(ans, ma1[i]);
        else if (pc[i] == ec[i] + 1)
          ans = max(ans, ma2[i]);
        else {
          ans = -1;
          break;
        }
      }
    printf("%d\n", ans);
  }
  return 0;
}
