#include <bits/stdc++.h>
using namespace std;
const int maxa = 100050;
int n, m, g, nn, mm, ra, rb, as0, bs0, a0[maxa], b0[maxa];
long long ans = 0;
int cnta[maxa], cntb[maxa];
int as = 0, bs = 0;
pair<int, int> a[maxa * 2], b[maxa * 2];
map<int, int> aa, bb, gg;
int qg[maxa * 4], qs = 0;
vector<pair<long long, int> > ga[maxa * 2], gb[maxa * 2];
pair<long long, int> p[maxa * 2];
int ps;
long long f[maxa];
inline int gcd(int u, int v) { return !v ? u : gcd(v, u % v); }
inline int pow(int x, int k, int mod) {
  int s = 1;
  for (; k; x = 1LL * x * x % mod, k >>= 1)
    if (k & 1) s = 1LL * s * x % mod;
  return s;
}
inline int fi(int x) {
  int i, lim = sqrt(x), s = 1;
  for (i = 2; i <= lim; i++)
    if (!(x % i)) {
      s *= i - 1, x /= i;
      while (!(x % i)) s *= i, x /= i;
    }
  if (x > 1) s *= x - 1;
  return s;
}
long long calc2(int d, int cy) {
  int i;
  long long s = -1e9;
  p[ps] = p[0];
  for (i = 0; i < ps; i++) {
    f[i] = (!i ? p[i].second
               : min((long long)p[i].second,
                     f[i - 1] + (p[i].first - p[i - 1].first + cy) % cy * d));
    s = max(s, f[i] + (p[i + 1].first - p[i].first - 1 + cy) % cy * d);
  }
  return s;
}
long long calc(int c) {
  int i, mn;
  long long s = -1e9;
  if (cnta[c] < nn) {
    for (i = 0; i < ga[c].size(); i++)
      ga[c][i].first = ga[c][i].first / g * ra % nn;
    sort(ga[c].begin(), ga[c].end());
    for (mn = 0, i = 1; i < ga[c].size(); i++)
      if (ga[c][i].second < ga[c][mn].second) mn = i;
    for (i = mn, ps = 0; i < ga[c].size(); i++) p[ps++] = ga[c][i];
    for (i = 0; i < mn; i++) p[ps++] = ga[c][i];
    s = max(s, calc2(m, n / g));
  }
  if (cntb[c] < mm) {
    for (i = 0; i < gb[c].size(); i++)
      gb[c][i].first = gb[c][i].first / g * rb % mm;
    sort(gb[c].begin(), gb[c].end());
    for (mn = 0, i = 1; i < gb[c].size(); i++)
      if (gb[c][i].second < gb[c][mn].second) mn = i;
    for (i = mn, ps = 0; i < gb[c].size(); i++) p[ps++] = gb[c][i];
    for (i = 0; i < mn; i++) p[ps++] = gb[c][i];
    s = max(s, calc2(n, m / g));
  }
  return s;
}
int main() {
  int i;
  map<int, int>::iterator t;
  scanf("%d%d", &n, &m);
  g = gcd(n, m), nn = n / g, mm = m / g;
  ra = pow(mm, fi(nn) - 1, nn);
  rb = pow(nn, fi(mm) - 1, mm);
  scanf("%d", &as0);
  for (i = 0; i < as0; i++) scanf("%d", &a0[i]), aa[a0[i]] = a0[i];
  sort(a0, a0 + as0);
  scanf("%d", &bs0);
  for (i = 0; i < bs0; i++) scanf("%d", &b0[i]), bb[b0[i]] = b0[i];
  sort(b0, b0 + bs0);
  for (i = 0; i < as0; i++)
    if (!bb.count(a0[i] % m)) bb[a0[i] % m] = a0[i];
  for (i = 0; i < bs0; i++)
    if (!aa.count(b0[i] % n)) aa[b0[i] % n] = b0[i];
  for (t = aa.begin(); t != aa.end(); t++) {
    qg[qs++] = (*t).first % g;
    a[as++] = *t;
  }
  for (t = bb.begin(); t != bb.end(); t++) {
    qg[qs++] = (*t).first % g;
    b[bs++] = *t;
  }
  sort(qg, qg + qs);
  qs = unique(qg, qg + qs) - qg;
  if (qs != g)
    ans = -1;
  else {
    for (i = 0; i < qs; i++) gg[qg[i]] = i;
    for (i = 0; i < as0; i++) cnta[gg[a0[i]] % g]++;
    for (i = 0; i < bs0; i++) cntb[gg[b0[i]] % g]++;
    for (i = 0; i < as; i++) ga[gg[a[i].first % g]].push_back(a[i]);
    for (i = 0; i < bs; i++) gb[gg[b[i].first % g]].push_back(b[i]);
    for (i = 0; i < qs; i++) ans = max(ans, calc(i));
  }
  printf("%I64d\n", ans);
  return 0;
}
