#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const int MX = 123456;
const int mod = (int)1e9 + 7;
const int base = 1023456789;
const unsigned long long BS1 = 10000019ULL;
const int INF = (1 << 29);
template <class T>
inline void fastScan(T &x) {
  register char c = getchar();
  int neg = 0;
  x = 0;
  for (; (c < 48 || c > 57) && (c != '-'); c = getchar())
    ;
  if (c == '-') {
    neg = 1;
    c = getchar();
  }
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  if (neg) x = -x;
}
int n;
bool f_prime[N];
int prime[N], sz;
struct info {
  long long a, b;
} inp[N + N];
int P(long long v) {
  int ret = 0;
  for (int i = 1; i <= n; i++) {
    if (inp[i].a % v == 0 || inp[i].b % v == 0) {
      ret++;
    } else {
      return 0;
    }
  }
  return (ret == n);
}
void Sieve() {
  for (int i = 4; i < N; i += 2) f_prime[i] = 1;
  for (int i = 3; i * i <= N; i += 2) {
    if (f_prime[i] == 0) {
      for (int j = i * i; j < N; j += i) {
        f_prime[j] = 1;
      }
    }
  }
  prime[++sz] = 2;
  for (int i = 3; i < N; i += 2) {
    if (f_prime[i] == 0) {
      prime[++sz] = i;
    }
  }
}
long long Solve(long long v) {
  for (int i = 1; i <= sz && 1ll * prime[i] * prime[i] <= v; i++) {
    if (v % prime[i] == 0) {
      if (P(prime[i])) return prime[i];
      while (v % prime[i] == 0) v /= prime[i];
    }
  }
  if (v > 1) {
    if (P(v)) return v;
  }
  return -1;
}
int main() {
  fastScan(n);
  for (int i = 1; i <= n; i++) {
    fastScan(inp[i].a);
    fastScan(inp[i].b);
  }
  Sieve();
  long long a = Solve(inp[1].a);
  long long b = Solve(inp[1].b);
  long long ans = max(a, b);
  printf("%lld\n", ans);
}
