#include <bits/stdc++.h>
using namespace std;
int N, V;
map<int, int> mapping;
vector<int> days;
vector<bool> visited;
vector<vector<int>> adj;
int get_mapping(int x) {
  if (mapping.find(x) == mapping.end()) {
    assert((int)days.size() == V);
    days.push_back(x);
    mapping[x] = V++;
  }
  return mapping[x];
}
int node_count, edge_count;
int max_day, max_day2;
void dfs(int node) {
  visited[node] = true;
  node_count++;
  edge_count += adj[node].size();
  if (days[node] > max_day2) {
    max_day2 = days[node];
    if (max_day2 > max_day) swap(max_day, max_day2);
  }
  for (int neighbor : adj[node])
    if (!visited[neighbor]) dfs(neighbor);
}
int main() {
  scanf("%d", &N);
  adj.resize(2 * N);
  V = 0;
  for (int i = 0; i < N; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a = get_mapping(a);
    b = get_mapping(b);
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  visited = vector<bool>(V, false);
  int answer = 0;
  for (int i = 0; i < V; i++)
    if (!visited[i]) {
      node_count = edge_count = 0;
      max_day = max_day2 = 0;
      dfs(i);
      edge_count /= 2;
      if (edge_count > node_count) {
        printf("-1\n");
        return 0;
      }
      answer = max(answer, edge_count == node_count ? max_day : max_day2);
    }
  printf("%d\n", answer);
  return 0;
}
