#include <bits/stdc++.h>
using namespace std;
long long i, i0, n, m;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
bool ispr(int num) {
  if (num == 1) return 0;
  if (num == 2 || num == 3) return 1;
  if (num % 6 != 1 && num % 6 != 5) return 0;
  int tmp = sqrt(num);
  for (int i = 5; i <= tmp; i += 6)
    if (num % i == 0 || num % (i + 2) == 0) return 0;
  return 1;
}
struct node {
  long long a, b;
} a[150005];
queue<int> dp[150005];
int main() {
  while (scanf("%lld", &n) != EOF) {
    for (i = 0; i < n; i++) scanf("%lld %lld", &a[i].a, &a[i].b);
    for (i = 2; i * i <= a[0].a; i++) {
      if (a[0].a % i == 0) {
        if (ispr(i)) dp[0].push(i);
        if (ispr(a[0].a / i)) dp[0].push(a[0].a / i);
      }
    }
    for (i = 2; i * i <= a[0].b; i++) {
      if (a[0].b % i == 0) {
        if (ispr(i)) dp[0].push(i);
        if (ispr(a[0].b / i)) dp[0].push(a[0].b / i);
      }
    }
    dp[0].push(a[0].a), dp[0].push(a[0].b);
    for (i = 1; i < n; i++) {
      while (!dp[i - 1].empty()) {
        if (a[i].a % dp[i - 1].front() == 0 || a[i].b % dp[i - 1].front() == 0)
          dp[i].push(dp[i - 1].front());
        dp[i - 1].pop();
      }
    }
    if (dp[n - 1].empty())
      printf("-1\n");
    else {
      printf("%d\n", dp[n - 1].front());
    }
  }
  return 0;
}
