#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  scanf("%d", &n);
  vector<int> a(n + 1), b(n + 1), v;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a[i], &b[i]);
    v.push_back(a[i]);
    v.push_back(b[i]);
  }
  sort(v.begin(), v.end());
  auto it = unique(v.begin(), v.end());
  v.erase(it, v.end());
  int m = v.size();
  vector<int> mk(m + 1), del(m + 1);
  vector<vector<int> > g(m + 1, vector<int>());
  auto sch = [&](int x) {
    return (int)(lower_bound(v.begin(), v.end(), x) - v.begin() + 1);
  };
  for (int i = 1; i <= n; i++) {
    int p = sch(a[i]);
    int q = sch(b[i]);
    g[p].push_back(q);
    g[q].push_back(p);
  }
  int nods = 0, edges = 0;
  function<void(int)> dfs = [&](int u) {
    mk[u] = 1;
    nods++;
    edges += g[u].size() + del[u];
    for (int v : g[u])
      if (!mk[v]) dfs(v);
  };
  auto can = [&](int x) {
    for (int i = 1; i <= m; i++) mk[i] = del[i] = 0;
    for (int i = 1; i <= m; i++)
      if (v[i - 1] > x) mk[i] = 1;
    for (int i = 1; i <= n; i++) {
      if (a[i] > x)
        return false;
      else {
        if (b[i] > x) {
          int p = sch(a[i]);
          if (del[p]) return false;
          del[p]++;
        }
      }
    }
    for (int i = 1; i <= m; i++) {
      if (!mk[i]) {
        nods = edges = 0;
        dfs(i);
        edges /= 2;
        if (edges > nods) return false;
      }
    }
    return true;
  };
  int st = 0, nd = m - 1, ans = -1;
  while (st <= nd) {
    int mid = (st + nd) >> 1;
    if (can(v[mid])) {
      ans = v[mid];
      nd = mid - 1;
    } else
      st = mid + 1;
  }
  printf("%d\n", ans);
  return 0;
}
