#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
const int N = 200000;
int n;
int m;
vector<int> v[N];
vector<int> w[N];
int p, q;
int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
int gcd2(int a, int b, int& c, int& d) {
  if (b == 0) {
    c = 1;
    d = 0;
    return 1;
  }
  int e, f;
  int g = gcd2(b, a % b, e, f);
  d = e - (a / b) * f;
  c = f;
  return g;
}
int power(int a, int b, int mod) {
  int c = 1;
  while (b) {
    if (b & 1) c = ((long long)c * a) % mod;
    a = ((long long)a * a) % mod;
    b /= 2;
  }
  return c;
}
int rev(int a, int mod) {
  int x, y;
  gcd2(a, mod, x, y);
  return (x % mod + mod) % mod;
}
set<int> all;
long long go(int r, int n, int m) {
  if (n == 1) {
    if (!v[r].empty()) return -1;
    long long ans = 1e18;
    for (int i = 0; i < ((int)(v[r]).size()); i++)
      ans = min(ans, (long long)v[r][i]);
    for (int i = 0; i < ((int)(w[r]).size()); i++)
      ans = min(ans, (long long)w[r][i]);
    return ans;
  }
  int rm = rev(m % n, n);
  vector<pair<int, int> > u;
  all.clear();
  for (int i = 0; i < ((int)(v[r]).size()); i++) {
    all.insert(((long long)v[r][i] * rm) % n);
    u.push_back(make_pair(((long long)v[r][i] * rm) % n, v[r][i]));
  }
  for (int i = 0; i < ((int)(w[r]).size()); i++)
    u.push_back(make_pair(((long long)w[r][i] * rm) % n, w[r][i]));
  sort((u).begin(), (u).end());
  vector<pair<int, int> > h;
  for (int i = 0; i < ((int)(u).size()); i++)
    if (i == 0 || (i > 0 && u[i].first != u[i - 1].first)) h.push_back(u[i]);
  long long ans = -1;
  h.push_back(make_pair(h[0].first + n, h[0].second));
  for (int i = 0; i + 1 < ((int)(h).size()); i++)
    h[i + 1].second =
        min((long long)h[i + 1].second,
            h[i].second + (long long)(h[i + 1].first - h[i].first) * m);
  h[0].second = h[((int)(h).size()) - 1].second;
  for (int i = 0; i + 1 < ((int)(h).size()); i++) {
    h[i + 1].second =
        min((long long)h[i + 1].second,
            h[i].second + (long long)(h[i + 1].first - h[i].first) * m);
    if (h[i + 1].first > h[i].first + 1 || !all.count(h[i].first))
      ans = max(ans,
                h[i].second + (long long)(h[i + 1].first - h[i].first - 1) * m);
  }
  return ans;
}
int main() {
  scanf("%d%d", &n, &m);
  int g = gcd(n, m);
  if (g > N) {
    printf("-1\n");
    return 0;
  }
  scanf("%d", &p);
  for (int i = 0; i < p; i++) {
    int x;
    scanf("%d", &x);
    v[x % g].push_back(x / g);
  }
  scanf("%d", &q);
  for (int i = 0; i < q; i++) {
    int x;
    scanf("%d", &x);
    w[x % g].push_back(x / g);
  }
  long long ans = 0;
  for (int i = 0; i < g; i++) {
    if (v[i].empty() && w[i].empty()) {
      printf("-1\n");
      return 0;
    }
    long long tmp = go(i, n / g, m / g);
    swap(v[i], w[i]);
    tmp = max(tmp, go(i, m / g, n / g));
    ans = max(ans, tmp * g + i);
  }
  cout << ans << endl;
  return 0;
}
