#include <bits/stdc++.h>
using namespace std;
long long gi() {
  char cc = getchar();
  long long cn = 0, flus = 1;
  while (cc < '0' || cc > '9') {
    if (cc == '-') flus = -flus;
    cc = getchar();
  }
  while (cc >= '0' && cc <= '9') cn = cn * 10 + cc - '0', cc = getchar();
  return cn * flus;
}
const long long N = 2e5 + 5;
long long n, m, B, G, g[N], b[N], A[N], cnt, cnt1, cnt2, _a, _b, Ai, Bi;
vector<long long> f[N], h[N];
struct node {
  long long d, c;
  node(long long _d = 0, long long _c = 0) { d = _d, c = _c; }
} A1[N], A2[N];
void out() {
  puts("-1");
  exit(0);
}
long long gcd(long long x, long long y) { return (!y) ? x : gcd(y, x % y); }
long long exgcd(long long x, long long y) {
  if (y == 0) {
    _a = 1, _b = 0;
    return x;
  }
  long long d = exgcd(y, x % y), ia = _b, ib = _a - (x / y) * _b;
  _a = ia, _b = ib;
  return d;
}
long long Get(long long x, long long type) {
  long long fa = Ai * x, fb = Bi * x;
  fa %= m;
  if (fa < 0) fa += m;
  fb %= n;
  if (fb < 0) fb += n;
  return (type) ? fa : fb;
}
bool cmp(node x, node y) { return (x.d == y.d) ? (x.c > y.c) : (x.d < y.d); }
long long Go(long long x, long long y, long long mod) {
  return (x < y) ? y - x - 1 : (mod - 1 - x + y);
}
map<long long, long long> m1, m2;
long long solve(long long x) {
  cnt = cnt1 = cnt2 = 0, m1.clear(), m2.clear();
  long long ans = 0;
  if ((f[x].size() == n) && (h[x].size() == m)) return -1;
  for (long long v : f[x]) A[++cnt] = v, m1[v] = 1;
  for (long long v : h[x]) A[++cnt] = v, m2[v] = 1;
  for (long long v : f[x])
    if (!m2[v % m]) ans = max(ans, v), m2[v % m] = 1;
  for (long long v : h[x])
    if (!m1[v % n]) ans = max(ans, v), m1[v % n] = 1;
  for (register long long i = (1); i <= (cnt); ++i)
    A1[++cnt1] = node(Get(A[i], 0), A[i]),
    A2[++cnt2] = node(Get(A[i], 1), A[i]);
  sort(A1 + 1, A1 + cnt1 + 1, cmp), sort(A2 + 1, A2 + cnt2 + 1, cmp);
  A1[cnt1 + 1] = A1[1], A2[cnt2 + 1] = A2[1];
  for (register long long i = (1); i <= (cnt1); ++i) {
    long long dis = A1[i].c + Go(A1[i].d, A1[i + 1].d, n) * m;
    if ((A1[i + 1].d - A1[i].d < 2) && (i != cnt1)) continue;
    ans = max(ans, dis);
  }
  for (register long long i = (1); i <= (cnt2); ++i) {
    long long dis = A2[i].c + Go(A2[i].d, A2[i + 1].d, m) * n;
    if ((A2[i + 1].d - A2[i].d < 2) && (i != cnt2)) continue;
    ans = max(ans, dis);
  }
  return ans;
}
signed main() {
  n = gi(), m = gi();
  long long d = gcd(n, m);
  B = gi();
  for (register long long i = (1); i <= (B); ++i) b[i] = gi();
  sort(b + 1, b + B + 1);
  G = gi();
  for (register long long i = (1); i <= (G); ++i) g[i] = gi();
  sort(g + 1, g + G + 1);
  if (d > B + G) out();
  long long ans = 0;
  n /= d, m /= d, exgcd(n, m), Ai = _a, Bi = _b, Ai %= m, Bi %= n;
  for (register long long i = (1); i <= (B); ++i)
    f[b[i] % d].push_back(b[i] / d);
  for (register long long i = (1); i <= (G); ++i)
    h[g[i] % d].push_back(g[i] / d);
  for (register long long i = (0); i <= (d - 1); ++i)
    if (!f[i].size() && !h[i].size()) out();
  for (register long long i = (0); i <= (d - 1); ++i)
    ans = max(ans, solve(i) * d + i);
  cout << ans << endl;
  return 0;
}
