#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
long long n, m, b, g, d, ans;
long long id1[400010], id2[400010];
vector<long long> v1[400010], v2[400010];
map<long long, long long> dis;
struct node {
  long long val, id;
};
vector<node> ve;
bool cmp(const node &a, const node &b) { return a.id < b.id; }
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
void exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b)
    x = 1, y = 0;
  else
    exgcd(b, a % b, y, x), y -= a / b * x;
}
long long solve(vector<long long> a, vector<long long> b) {
  if (b.size() == m) return -1;
  long long v = 0, x, y, s;
  exgcd(n, m, x, y), x = (x % m + m) % m, dis.clear(), ve.clear();
  for (int i = 0; i < b.size(); ++i) dis[b[i]] = b[i];
  for (int i = 0; i < a.size(); ++i) {
    if (dis.count(a[i] % m))
      dis[a[i] % m] = min(dis[a[i] % m], a[i]);
    else
      dis[a[i] % m] = a[i];
  }
  s = (*dis.begin()).first;
  for (map<long long, long long>::iterator it = dis.begin(); it != dis.end();
       ++it)
    ve.push_back({(*it).second, x * ((*it).second - s) % m});
  sort(ve.begin(), ve.end(), cmp);
  for (int i = 1; i < ve.size(); ++i)
    v = max(v, ve[i - 1].val + (ve[i].id - ve[i - 1].id - 1) * n);
  if (ve.size() == 1)
    v = ve[0].val + (m - 1) * n;
  else
    v = max(v, ve[ve.size() - 1].val + (m - ve[ve.size() - 1].id - 1) * n);
  return v;
}
int main() {
  read(n), read(m);
  read(b);
  for (int i = 1; i <= b; ++i) read(id1[i]);
  read(g);
  for (int i = 1; i <= g; ++i) read(id2[i]);
  d = gcd(n, m), n /= d, m /= d;
  if (d > b + g) {
    puts("-1");
    return 0;
  }
  for (int i = 1; i <= b; ++i) v1[id1[i] % d].push_back(id1[i] / d);
  for (int i = 1; i <= g; ++i) v2[id2[i] % d].push_back(id2[i] / d);
  for (int i = 0; i < d; ++i) {
    if (v1[i].empty() && v2[i].empty()) {
      puts("-1");
      return 0;
    }
  }
  for (int i = 0; i < d; ++i) {
    long long v = solve(v1[i], v2[i]);
    if (~v) ans = max(ans, d * v + i);
  }
  swap(n, m);
  for (int i = 0; i < d; ++i) {
    long long v = solve(v2[i], v1[i]);
    if (~v) ans = max(ans, d * v + i);
  }
  printf("%lld", ans);
  return 0;
}
