#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool chkmin(T &x, T y) {
  return x > y ? x = y, 1 : 0;
}
template <typename T>
bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
int readint() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
long long N, M, n, m, g, ans;
long long a[100005], b[100005];
vector<pair<long long, pair<long long, long long> > > va[200005], vb[200005];
long long gcd(long long x, long long y) { return y == 0 ? x : gcd(y, x % y); }
void exgcd(int x, int y, int &a, int &b) {
  if (y == 0) return (void)(a = 1, b = 0);
  exgcd(y, x % y, b, a);
  b -= a * (x / y);
}
int main() {
  N = readint();
  M = readint();
  n = readint();
  for (int i = 1; i <= n; i++) a[i] = readint();
  m = readint();
  for (int i = 1; i <= m; i++) b[i] = readint();
  g = gcd(N, M);
  N /= g, M /= g;
  int invn = 0, invm = 0;
  exgcd(N, M, invn, invm);
  while (invn < 0) invn += M;
  while (invm < 0) invm += N;
  if (g > n + m) return printf("-1\n"), 0;
  for (int i = 1; i <= n; i++)
    va[a[i] % g].push_back(make_pair(a[i] / g, make_pair(0, a[i])));
  for (int i = 1; i <= m; i++)
    vb[b[i] % g].push_back(make_pair(b[i] / g, make_pair(0, b[i])));
  for (int i = 0; i < g; i++) {
    if (!va[i].size() && !vb[i].size()) return printf("-1\n"), 0;
    int vas = va[i].size(), vbs = vb[i].size();
    for (int j = 0; j < vas; j++)
      vb[i].push_back(
          make_pair(va[i][j].first % M, make_pair(1, va[i][j].second.second)));
    for (int j = 0; j < vbs; j++)
      va[i].push_back(
          make_pair(vb[i][j].first % N, make_pair(1, vb[i][j].second.second)));
    for (int j = 0; j < va[i].size(); j++)
      va[i][j].first = 1ll * va[i][j].first * invm % N;
    for (int j = 0; j < vb[i].size(); j++)
      vb[i][j].first = 1ll * vb[i][j].first * invn % M;
    sort(va[i].begin(), va[i].end());
    sort(vb[i].begin(), vb[i].end());
    if (va[i][0].second.first == 1) chkmax(ans, va[i][0].second.second);
    if (vb[i][0].second.first == 1) chkmax(ans, vb[i][0].second.second);
    for (int j = 1; j < va[i].size(); j++)
      if (va[i][j].first != va[i][j - 1].first && va[i][j].second.first == 1)
        chkmax(ans, va[i][j].second.second);
    for (int j = 1; j < vb[i].size(); j++)
      if (vb[i][j].first != vb[i][j - 1].first && vb[i][j].second.first == 1)
        chkmax(ans, vb[i][j].second.second);
    for (int j = 1; j < va[i].size(); j++)
      chkmin(va[i][j].second.second,
             va[i][j - 1].second.second +
                 (va[i][j].first - va[i][j - 1].first) * (M * g));
    for (int j = 1; j < vb[i].size(); j++)
      chkmin(vb[i][j].second.second,
             vb[i][j - 1].second.second +
                 (vb[i][j].first - vb[i][j - 1].first) * (N * g));
    if (va[i][va[i].size() - 1].first != N - 1 || va[i][0].first != 0)
      chkmax(ans,
             1ll * (va[i][0].first + N - 1 - va[i][va[i].size() - 1].first) *
                     (M * g) +
                 va[i][va[i].size() - 1].second.second);
    for (int j = 1; j < va[i].size(); j++)
      if (va[i][j].first > va[i][j - 1].first + 1)
        chkmax(ans, 1ll * (va[i][j].first - 1 - va[i][j - 1].first) * (M * g) +
                        va[i][j - 1].second.second);
    if (vb[i][vb[i].size() - 1].first != M - 1 || vb[i][0].first != 0)
      chkmax(ans,
             1ll * (vb[i][0].first + M - 1 - vb[i][vb[i].size() - 1].first) *
                     (N * g) +
                 vb[i][vb[i].size() - 1].second.second);
    for (int j = 1; j < vb[i].size(); j++)
      if (vb[i][j].first > vb[i][j - 1].first + 1)
        chkmax(ans, 1ll * (vb[i][j].first - 1 - vb[i][j - 1].first) * (N * g) +
                        vb[i][j - 1].second.second);
  }
  printf("%lld\n", ans);
  return 0;
}
