#include <bits/stdc++.h>
using namespace std;
const unsigned long long MOD = 1e9 + 7;
const unsigned long long INF = 1e15 + 7;
const unsigned long long N = 1e6;
unsigned long long gcd(unsigned long long a, unsigned long long b) {
  unsigned long long r;
  while (b) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
unsigned long long fpow(unsigned long long n, unsigned long long k,
                        unsigned long long p = MOD) {
  unsigned long long r = 1;
  for (; k; k >>= 1) {
    if (k & 1) r = r * n % p;
    n = n * n % p;
  }
  return r;
}
unsigned long long inv(unsigned long long a, unsigned long long p = MOD) {
  return fpow(a, p - 2, p);
}
unsigned long long mult(unsigned long long a, unsigned long long b,
                        unsigned long long p = MOD) {
  return (unsigned long long)((a % p) * (b % p)) % p;
}
vector<unsigned long long> prime(N + 1);
void sieve() {
  prime[0] = prime[1] = 1;
  for (unsigned long long i = 2; i <= N; i++) {
    if (!prime[i]) {
      prime[i] = i;
      for (unsigned long long j = i * i; j <= N; j += i)
        if (!prime[j]) prime[j] = i;
    }
  }
}
vector<unsigned long long> factor(unsigned long long n) {
  vector<unsigned long long> ans;
  for (int i = 2; i <= n; i++) {
    if (prime[i]) {
      ans.push_back(i);
    }
  }
  return ans;
}
vector<unsigned long long> getfactor(unsigned long long x) {
  vector<unsigned long long> ret;
  while (x != 1) {
    ret.push_back(prime[x]);
    x = x / prime[x];
  }
  return ret;
}
void primefactor(unsigned long long n, set<unsigned long long> st) {
  cout << "sss";
  long long z = 2;
  while (z * z <= n) {
    if (n % z == 0) {
      { st.insert(z); }
      n /= z;
    } else {
      z++;
    }
  }
  if (n > 1) {
    st.insert(n);
  }
}
int main() {
  sieve();
  unsigned long long tt;
  cin >> tt;
  unsigned long long x[tt], y[tt], xmin, xalter;
  xmin = xalter = LLONG_MAX;
  for (unsigned long long t = 0; t < tt; t++) {
    cin >> x[t] >> y[t];
    if (xmin > min(x[t], y[t])) {
      xmin = min(x[t], y[t]);
      xalter = max(x[t], y[t]);
    }
  }
  unsigned long long o = xmin;
  set<unsigned long long> st;
  unsigned long long n = o;
  long long z = 2;
  while (z * z <= n) {
    if (n % z == 0) {
      { st.insert(z); }
      n /= z;
    } else {
      z++;
    }
  }
  if (n > 1) {
    st.insert(n);
  }
  n = xalter;
  z = 2;
  while (z * z <= n) {
    if (n % z == 0) {
      { st.insert(z); }
      n /= z;
    } else {
      z++;
    }
  }
  if (n > 1) {
    st.insert(n);
  }
  for (unsigned long long i = 0; i < tt; i++) {
    std::set<unsigned long long>::iterator it = st.begin();
    vector<set<unsigned long long>::iterator> vit;
    vector<unsigned long long> vvv;
    for (; it != st.end(); ++it) {
      if (x[i] % (*it) == 0 || y[i] % (*it) == 0) {
      } else {
        vit.push_back(it);
        vvv.push_back(*it);
      }
    }
    vector<set<unsigned long long>::iterator>::iterator itr = vit.begin();
    vector<unsigned long long>::iterator vvvit = vvv.begin();
    for (; vvvit != vvv.end(); vvvit++) {
      st.erase(*vvvit);
    }
  }
  if (st.size() > 0) {
    cout << (*st.begin()) << "\n";
  } else {
    cout << "-1\n";
  }
  return 0;
}
