#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
template <typename T1, typename T2>
void ckmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
void ckmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
template <typename T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
long long read() {
  long long x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = 10 * x + ch - '0', ch = getchar();
  return f ? -x : x;
}
long long n, m, b, g, d, x[100005], y[100005];
long long c[200005];
vector<long long> V[200005], W[200005];
struct node {
  long long x, y, z;
};
vector<node> buc;
map<long long, long long> mp;
long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }
void exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1;
    y = 0;
    return;
  }
  exgcd(b, a % b, y, x);
  y -= (a / b) * x;
}
bool cmp(node x, node y) { return x.z < y.z; }
long long solve(vector<long long> v, vector<long long> w) {
  if (w.size() == m) return -1;
  if (v.size() == 0 && w.size() == 0) return -2;
  long long ans = 0;
  mp.clear();
  for (auto i : w) mp[i] = i;
  for (auto i : v)
    if (mp.find(i % m) == mp.end())
      mp[i % m] = i;
    else
      mp[i % m] = min(mp[i % m], i);
  buc.clear();
  long long t1, t2;
  for (auto i : mp) {
    buc.push_back(node{i.first, i.second, 0});
    exgcd(n, m, t1, t2);
    long long t = 1ll * t1 * i.first;
    t += 1ll * m * ceil(1.0 * (1 - t) / m);
    if (t == m) t -= m;
    buc[buc.size() - 1].z = t;
  }
  sort(buc.begin(), buc.end(), cmp);
  for (long long i = 1; i < buc.size(); i++)
    ans = max(ans, buc[i - 1].y + 1ll * (buc[i].z - buc[i - 1].z - 1) * n);
  if (buc.size() > 1)
    ans = max(ans, buc[buc.size() - 1].y +
                       1ll * (m - buc[buc.size() - 1].z + buc[0].z - 1) * n);
  else
    ans = 1ll * (m - 1) * n + buc[0].y;
  return ans;
}
signed main() {
  scanf("%lld%lld", &n, &m);
  scanf("%lld", &b);
  for (long long i = 1; i <= b; i++) scanf("%lld", &x[i]);
  scanf("%lld", &g);
  for (long long i = 1; i <= g; i++) scanf("%lld", &y[i]);
  d = gcd(n, m);
  if (d > b + g) {
    puts("-1");
    return 0;
  }
  for (long long i = 1; i <= b; i++) V[x[i] % d].push_back(x[i] / d);
  for (long long i = 1; i <= g; i++) W[y[i] % d].push_back(y[i] / d);
  n /= d, m /= d;
  long long ans = 0;
  for (long long i = 0; i < d; i++) {
    long long t = solve(V[i], W[i]);
    if (t == -2) {
      puts("-1");
      return 0;
    }
    if (t == -1) continue;
    ans = max(ans, t * d + i);
  }
  swap(n, m);
  for (long long i = 0; i < d; i++) {
    long long t = solve(W[i], V[i]);
    if (t == -1) continue;
    ans = max(ans, t * d + i);
  }
  printf("%lld\n", ans);
  return 0;
}
