#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, b, g, x, d, sum;
struct nod {
  int c, l, x;
} a[N * 2];
int a0;
int gcd(int x, int y) { return !y ? x : gcd(y, x % y); }
void exgcd(int a, int b, int &x, int &y) {
  if (!b) {
    x = a;
    y = 0;
    return;
  }
  int X, Y;
  exgcd(b, a % b, X, Y);
  x = Y;
  y = X - (a / b) * Y;
}
int solve(int a, int b, int c) {
  int d = gcd(a, gcd(b, c));
  a /= d;
  b /= d;
  c /= d;
  int x, y;
  exgcd(a, b, x, y);
  x = (long long)x * c % b;
  x = (x + b) % b;
  return x;
}
int cmp(nod a, nod b) { return a.c < b.c; }
int fi[N * 10], nt[N * 10], to[N * 10], tot;
long long v[N * 10];
void link(int x, int y, long long z) {
  nt[++tot] = fi[x], to[tot] = y, v[tot] = z, fi[x] = tot;
}
int td = 1;
struct nod2 {
  int a, s;
} t[N * 10];
int t0;
int cmp2(nod2 a, nod2 b) { return a.a < b.a; }
void ins(int n, int m, int x) {
  t[++t0].s = x;
  x -= x % d;
  int a = solve(m, n, x);
  t[t0].a = a;
}
const int M = 3171391;
struct Hash {
  int h[M], h2[M];
  int a(int x) {
    x++;
    int y = x % M;
    while (h[y] != 0 && h[y] != x) y = (y + 1) % M;
    if (!h[y]) h[y] = x, h2[y] = ++td;
    return h2[y];
  }
} b1, b2;
void gg(Hash &b, int n, int m) {
  sort(t + 1, t + t0 + 1, cmp2);
  for (int i = 1; i <= t0; i++) link(1, (b.a(t[i].s)), t[i].s);
  for (int i = 1; i <= t0; i++) {
    link((b.a(t[i].s)), (b.a(((t[i].s + m) % n))), m);
    link((b.a((((t[i].s - m) % n + n) % n))), (b.a(t[i].s)), m);
  }
  for (int i = 2; i <= t0; i++)
    if (t[i - 1].a + 1 < t[i].a)
      link((b.a(((t[i - 1].s + m) % n))), (b.a((((t[i].s - m) % n + n) % n))),
           (long long)(t[i].a - t[i - 1].a - 2) * m);
  if ((n / d - (t[t0].a - t[1].a) - 2) > 0)
    link((b.a(((t[t0].s + m) % n))), (b.a((((t[1].s - m) % n + n) % n))),
         (long long)(n / d - (t[t0].a - t[1].a) - 2) * m);
}
struct ds {
  long long y;
  int x;
} w[N * 10];
bool operator<(ds a, ds b) { return a.y > b.y; }
priority_queue<ds> q;
int bz[N * 10];
void dij() {
  for (int i = 2; i <= td; i++) w[i].y = 9e18;
  for (int i = 1; i <= td; i++) w[i].x = i;
  q.push(w[1]);
  while (!q.empty()) {
    ds b = q.top();
    q.pop();
    if (bz[b.x] || b.y > w[b.x].y) continue;
    bz[b.x] = 1;
    for (int i = fi[b.x]; i; i = nt[i])
      if (v[i] + b.y < w[to[i]].y) w[to[i]].y = v[i] + b.y, q.push(w[to[i]]);
  }
}
int xg[N * 10], xc[N * 10];
int main() {
  scanf("%d %d", &n, &m);
  d = gcd(n, m);
  scanf("%d", &b);
  for (int i = 1; i <= b; i++) {
    scanf("%d", &x);
    a[++a0].x = x;
    a[a0].c = x % d;
    a[a0].l = 1;
  }
  scanf("%d", &g);
  for (int i = 1; i <= g; i++) {
    scanf("%d", &x);
    a[++a0].x = x;
    a[a0].c = x % d;
    a[a0].l = 2;
  }
  sort(a + 1, a + a0 + 1, cmp);
  int la = 1;
  td = 1;
  for (int i = 2; i <= a0 + 1; i++)
    if (i > a0 || a[i].c != a[i - 1].c) {
      sum++;
      t0 = 0;
      for (int j = la; j <= i - 1; j++) {
        ins(n, m, a[j].x % n);
        if (a[j].l == 1) xg[++xg[0]] = a[j].x;
      }
      gg(b1, n, m);
      t0 = 0;
      for (int j = la; j <= i - 1; j++) {
        ins(m, n, a[j].x % m);
        if (a[j].l == 2) xc[++xc[0]] = a[j].x;
      }
      gg(b2, m, n);
      la = i;
    }
  if (sum < d) {
    printf("-1\n");
    return 0;
  }
  dij();
  for (int i = 1; i <= xg[0]; i++) w[b1.a(xg[i])].y = 0;
  for (int i = 1; i <= xc[0]; i++) w[b2.a(xc[i])].y = 0;
  long long ans = 0;
  for (int i = 1; i <= td; i++) ans = max(ans, w[i].y);
  printf("%I64d", ans);
}
