#include <bits/stdc++.h>
using namespace std;
namespace red {
inline long long read() {
  long long x = 0;
  char ch, f = 1;
  for (ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar())
    ;
  if (ch == '-') f = 0, ch = getchar();
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return f ? x : -x;
}
const long long N = 3e5 + 10, inf = 0x3f3f3f3f3f3f3f3f;
long long n, m, sum, d, B, G, b[N], g[N];
vector<long long> a[N], f[N];
long long ans;
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
inline void exgcd(long long &x, long long &y, long long a, long long b) {
  if (!b) {
    x = 1, y = 0;
  } else {
    exgcd(y, x, b, a % b);
    y -= a / b * x;
  }
}
inline long long solve(vector<long long> a, vector<long long> b) {
  vector<long long> s = a;
  sum = b.size();
  for (long long i = 0; i < sum; ++i) s.push_back(b[i]);
  sort(s.begin(), s.end());
  long long k = unique(s.begin(), s.end()) - s.begin(), x, y;
  if (n == k) {
    long long c[m];
    memset(c, 0, sizeof(c));
    sum = a.size();
    for (long long i = 0; i < sum; ++i)
      if (a[i] < m) ++c[a[i]];
    sum = b.size();
    for (long long i = 0; i < sum; ++i)
      if (b[i] < m) ++c[b[i]];
    for (long long i = m - 1; ~i; --i)
      if (c[i] == 1) return i;
    return -1;
  }
  vector<pair<long long, long long> > e[k << 1 | 1];
  for (long long i = 0; i < k; ++i)
    e[k << 1].push_back(pair<long long, long long>(i, s[i])),
        e[i + k].push_back(pair<long long, long long>(i, m));
  exgcd(x, y, m, n), x = (x % n + n) % n;
  pair<long long, long long> p[k];
  for (long long i = 0; i < k; ++i)
    p[i] = pair<long long, long long>(x * (s[i] - s[0]) % n, i);
  sort(p, p + k);
  for (long long i = 0, j = 1 % k; i < k; ++i, j = (++j == k) ? 0 : j)
    e[p[i].second].push_back(pair<long long, long long>(
        p[j].second + k,
        m * (p[j].first - p[i].first - 1 < 0 ? p[j].first - p[i].first - 1 + n
                                             : p[j].first - p[i].first - 1)));
  map<long long, long long> h;
  for (long long i = 0; i < k; ++i) h[s[i]] = i;
  for (long long i = 0; i < k; ++i)
    if (h.find((s[i] + m) % n) != h.end()) {
      long long j = h[(s[i] + m) % n];
      e[i].push_back(pair<long long, long long>(j + k, 0)),
          e[j + k].push_back(pair<long long, long long>(i, 0));
    }
  priority_queue<pair<long long, long long>,
                 vector<pair<long long, long long> >,
                 greater<pair<long long, long long> > >
      q;
  bool vis[2 * k + 1];
  long long dis[2 * k + 1], ret = 0;
  memset(vis, 0, sizeof(vis));
  memset(dis, 0x3f, sizeof(dis));
  q.push(pair<long long, long long>(0, 2 * k)), dis[2 * k] = 0;
  while (!q.empty()) {
    long long now = q.top().second;
    q.pop();
    if (vis[now]) continue;
    vis[now] = 1, ret = max(ret, dis[now]);
    sum = e[now].size();
    for (long long i = 0; i < sum; ++i) {
      long long t = e[now][i].first;
      long long len = e[now][i].second;
      if (dis[t] > dis[now] + len) {
        dis[t] = dis[now] + len;
        q.push(pair<long long, long long>(dis[t], t));
      }
    }
  }
  return ret;
}
inline void main() {
  n = read(), m = read(), B = read();
  for (long long i = 1; i <= B; ++i) b[i] = read();
  G = read();
  for (long long i = 1; i <= G; ++i) g[i] = read();
  if (n < m) swap(n, m), swap(B, G), swap(b, g);
  if ((d = gcd(n, m)) > B + G) return (void)puts("-1");
  n /= d, m /= d;
  for (long long i = 1; i <= B; ++i) a[b[i] % d].push_back(b[i] / d);
  for (long long i = 1; i <= G; ++i) f[g[i] % d].push_back(g[i] / d);
  for (long long i = 0; i < d; ++i)
    if (!a[i].size() && !f[i].size()) return (void)puts("-1");
  for (long long i = 0; i < d; ++i) ans = max(ans, solve(a[i], f[i]) * d + i);
  printf("%lld\n", ans);
}
}  // namespace red
signed main() {
  red::main();
  return 0;
}
