#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
template <class T>
void R(T &x) {
  cin >> x;
}
void R(int &x) { scanf("%d", &x); }
void R(long long &x) { scanf("%lld", &x); }
void R(double &x) { scanf("%lf", &x); }
void R(char &x) { scanf(" %c", &x); }
void R(char *x) { scanf("%s", x); }
long long _pow(long long a, long long b) {
  long long res = 1ll;
  while (b) {
    if (b & 1) res = res * a % 1000000007;
    a = a * a % 1000000007;
    b >>= 1;
  }
  return res;
}
int n;
long long a[150005], b[150005];
const int mxn = 1e7 + 5;
bool mark[mxn];
long long prime[mxn], tot;
void getPrime() {
  tot = 0;
  memset(mark, 1, sizeof(mark));
  for (int i = 2; i < mxn; i++) {
    if (mark[i]) prime[tot++] = i;
    for (int j = 0; (j < tot) && (i * prime[j] < mxn); j++) {
      mark[i * prime[j]] = 0;
      if (i % prime[j] == 0) break;
    }
  }
}
bool check(long long x) {
  for (int i = 0; i < n; i++)
    if (a[i] % x && b[i] % x) return 0;
  return 1;
}
int main() {
  tot = 0;
  getPrime();
  R(n);
  for (int i = 0; i < n; i++) R(a[i]), R(b[i]);
  set<long long> q;
  long long x = a[0], y = b[0];
  for (int i = 0; i < tot && prime[i] < x; i++) {
    if (x % prime[i] == 0) {
      q.insert(prime[i]);
      while (x % prime[i] == 0) x /= prime[i];
    }
  }
  if (x != 1) q.insert(x);
  for (int i = 0; i < tot && prime[i] < y; i++) {
    if (y % prime[i] == 0) {
      q.insert(prime[i]);
      while (y % prime[i] == 0) y /= prime[i];
    }
  }
  if (y != 1) q.insert(y);
  long long res = -1;
  set<long long>::iterator it;
  for (it = q.begin(); it != q.end(); it++)
    if (check(*it)) {
      res = (*it);
      break;
    }
  printf("%lld\n", res);
  return 0;
}
