#include <bits/stdc++.h>
const long long maxn = 2e6 + 9, mod = 998244353, inf = 1e18;
long long Read() {
  long long x(0), f(1);
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3ll) + (x << 1ll) + c - '0';
    c = getchar();
  }
  return x * f;
}
void Chkmin(long long &x, long long y) {
  if (y < x) x = y;
}
void Chkmax(long long &x, long long y) {
  if (y > x) x = y;
}
long long add(long long x, long long y) {
  return x += y, x >= mod ? x - mod : x;
}
long long dec(long long x, long long y) { return x -= y, x < 0 ? x + mod : x; }
long long mul(long long x, long long y) { return 1ll * x * y % mod; }
long long Pow(long long base, long long b) {
  long long ret(1);
  while (b) {
    if (b & 1) ret = mul(ret, base);
    base = mul(base, base);
    b >>= 1;
  }
  return ret;
}
long long Gcd(long long x, long long y) { return y ? Gcd(y, x % y) : x; }
long long Exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  long long tmp(Exgcd(b, a % b, y, x));
  y = y - a / b * x;
  return tmp;
}
long long X, Y;
std::vector<long long> S1[maxn], S2[maxn];
long long Solve(long long n, long long m, long long x, std::vector<long long> A,
                std::vector<long long> B) {
  if (A.size() == m) return -1;
  static std::pair<long long, long long> a[maxn];
  static long long d[maxn];
  long long tot(0);
  for (long long i = 0; i < A.size(); ++i) {
    long long id(A[i] * x % n);
    ++tot;
    a[tot] = std::pair<long long, long long>(id, -tot);
    d[tot] = A[i];
  }
  for (long long i = 0; i < B.size(); ++i) {
    long long id(B[i] * x % n);
    ++tot;
    a[tot] = std::pair<long long, long long>(id, -tot);
    d[tot] = B[i];
  }
  std::sort(a + 1, a + 1 + tot);
  long long pre(-1);
  a[0] = std::pair<long long, long long>(a[tot].first - n, 0ll);
  a[tot + 1] = std::pair<long long, long long>(a[1].first + n, 0ll);
  long long ret(inf);
  for (long long i = 1; i <= tot; ++i) {
    ret = std::min(ret + m * (a[i].first - a[i - 1].first), d[-a[i].second]);
  }
  long long ans(0);
  for (long long i = 1; i <= tot; ++i) {
    ret = std::min(ret + m * (a[i].first - a[i - 1].first), d[-a[i].second]);
    if (a[i].first == a[i + 1].first) continue;
    if (a[i].first + 1 == a[i + 1].first) {
      if (-a[i].second > A.size()) {
        Chkmax(ans, ret);
      }
      continue;
    }
    Chkmax(ans, ret + m * (a[i + 1].first - 1 - a[i].first));
  }
  return ans;
}
long long n, m;
int main() {
  n = Read();
  m = Read();
  long long g(Gcd(n, m));
  if (g > 200000) {
    puts("-1");
    return 0;
  }
  {
    long long tmp(Read());
    for (long long i = 0; i < tmp; ++i) {
      long long x(Read());
      S1[x % g].push_back(x / g);
    }
  }
  {
    long long tmp(Read());
    for (long long i = 0; i < tmp; ++i) {
      long long x(Read());
      S2[x % g].push_back(x / g);
    }
  }
  long long ret(0);
  n /= g;
  m /= g;
  Exgcd(n, m, X, Y);
  X = (X % m + m) % m;
  Y = (Y % n + n) % n;
  for (long long i = 0; i < g; ++i) {
    if (!S1[i].size() && !S2[i].size()) {
      puts("-1");
      return 0;
    }
    Chkmax(ret, Solve(n, m, Y, S1[i], S2[i]) * g + i);
    Chkmax(ret, Solve(m, n, X, S2[i], S1[i]) * g + i);
  }
  printf("%lld\n", ret);
  return 0;
}
