#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int read() {
  int f = 1, g = 0;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) g = g * 10 + ch - '0';
  return f * g;
}
int n, m, cn, cm, R;
long long ans;
vector<int> a[N], b[N];
int exgcd(int n, int m, int &x, int &y) {
  if (!m) {
    x = 1, y = 0;
    return n;
  }
  int g = exgcd(m, n % m, y, x);
  y -= (n / m) * x;
  return g;
}
int cnt, c[N * 2], h[N * 2];
vector<pair<int, long long> > e[N * 2];
long long dist[N * 2];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    f;
long long dij() {
  for (int i = 0; i <= cnt; i++) dist[i] = 0x3f3f3f3f3f3f3f3fll, h[i] = 0;
  dist[cnt] = 0;
  f.push(make_pair(dist[cnt], cnt));
  while (1) {
    while ((!f.empty()) && h[f.top().second]) f.pop();
    if (f.empty()) break;
    int x = f.top().second;
    f.pop();
    h[x] = 1;
    for (auto t : e[x]) {
      int y = t.first;
      long long w = t.second;
      if (dist[y] > dist[x] + w) {
        dist[y] = dist[x] + w;
        f.push(make_pair(dist[y], y));
      }
    }
  }
  long long ret = 0;
  for (int i = 0; i <= cnt; i++) ret = max(ret, dist[i]);
  return ret;
}
long long solve(int k) {
  if (a[k].size() + b[k].size() == 0) return -1;
  if ((int)(a[k].size() + b[k].size()) >= m) {
    memset(h, 0, m * 4);
    for (auto x : a[k])
      if (x < m) h[x]++;
    for (auto x : b[k]) h[x]++;
    int fl = 1;
    for (int i = 0; i < m; i++)
      if (!h[i]) {
        fl = 0;
        break;
      }
    if (fl) {
      long long t = n - 1;
      sort(a[k].begin(), a[k].end());
      while ((t >= m) && a[k].size() && (a[k].back() == t)) {
        t--;
        a[k].pop_back();
      }
      if (t < m)
        while ((t >= 0) && (h[t] == 2)) t--;
      return t + 1;
    }
  }
  cnt = 0;
  for (auto x : a[k])
    c[cnt++] = (long long)x * R % n, c[cnt++] = ((long long)x * R + n - 1) % n;
  for (auto x : b[k])
    c[cnt++] = (long long)x * R % n, c[cnt++] = ((long long)x * R + n - 1) % n;
  sort(c, c + cnt);
  cnt = unique(c, c + cnt) - c;
  for (int i = 0; i <= cnt; i++) e[i].clear();
  for (int i = 0; i < cnt; i++)
    e[i].emplace_back((i + 1) % cnt,
                      (long long)(c[(i + 1) % cnt] - c[i] + n) % n * m);
  for (auto x : a[k]) {
    int i = lower_bound(c, c + cnt, (long long)x * R % n) - c;
    e[cnt].emplace_back(i, (long long)x);
  }
  for (auto x : b[k]) {
    int i = lower_bound(c, c + cnt, (long long)x * R % n) - c;
    e[cnt].emplace_back(i, (long long)x);
  }
  return dij() + 1;
}
int main() {
  n = read();
  m = read();
  int x, y, g;
  g = exgcd(n, m, x, y);
  if (g > 200000) {
    puts("-1");
    return 0;
  }
  cn = read();
  while (cn--) {
    int x = read();
    a[x % g].push_back(x / g);
  }
  cm = read();
  while (cm--) {
    int y = read();
    b[y % g].push_back(y / g);
  }
  n /= g;
  m /= g;
  R = (y % n + n) % n;
  if (n < m) {
    swap(n, m);
    swap(a, b);
    R = (x % n + n) % n;
  }
  ans = 0;
  for (int i = 0; i < g; i++) {
    long long t = solve(i);
    if (t < 0) {
      puts("-1");
      return 0;
    }
    if (t > 0) ans = max(ans, (t - 1) * g + i);
  }
  printf("%lld\n", ans);
  return 0;
}
