#include <bits/stdc++.h>
using namespace std;
const int N = 500001;
long long n, m, cnt_boy, cnt_girl, invn, invm, d, ans = 0;
vector<long long> v[N + 10];
map<long long, int> mp1, mp2;
struct data {
  long long loc, va;
} a[N + 10], b[N + 10];
bool cmp(data p, data q) {
  if (p.loc != q.loc) return p.loc < q.loc;
  return p.va < q.va;
}
long long Ex_gcd(long long x, long long y, long long &nowx, long long &nowy) {
  if (y == 0) {
    nowx = 1;
    nowy = 0;
    return x;
  }
  long long px, py;
  long long ans = Ex_gcd(y, x % y, px, py);
  nowx = py;
  nowy = px - x / y * py;
  return ans;
}
long long Calc(int px, int kx) {
  long long ans = -1, tot = 0, now = 0;
  for (int i = 0; i < (int)v[px].size(); i++) {
    long long k = v[px][i];
    if (kx == 0)
      a[++tot].loc = ((k * invm % n) + n) % n;
    else
      a[++tot].loc = ((k * invn % m) + m) % m;
    a[tot].va = k;
  }
  sort(a + 1, a + tot + 1, cmp);
  for (int i = 1; i <= tot; i++)
    if (!now || b[now].loc != a[i].loc) {
      b[++now] = a[i];
      continue;
    }
  for (int i = 1; i < now; i++)
    if (kx == 0) {
      if (b[i + 1].loc - b[i].loc > 1 ||
          mp1.find(b[i].loc * m % n * d + px) == mp1.end())
        ans = max(ans, (b[i + 1].loc - b[i].loc - 1) * m + b[i].va);
    } else if (b[i + 1].loc - b[i].loc > 1 ||
               mp2.find(b[i].loc * n % m * d + px) == mp2.end())
      ans = max(ans, (b[i + 1].loc - b[i].loc - 1) * n + b[i].va);
  if (kx == 0) {
    if (b[1].loc - b[now].loc + n > 1 ||
        mp1.find(b[now].loc * m % n * d + px) == mp1.end())
      ans = max(ans, (b[1].loc - b[now].loc + n - 1) * m + b[now].va);
  } else if (b[1].loc - b[now].loc + m > 1 ||
             mp2.find(b[now].loc * n % m * d + px) == mp2.end())
    ans = max(ans, (b[1].loc - b[now].loc + m - 1) * n + b[now].va);
  return ans;
}
long long work(int px) {
  if (v[px].size() == 0) {
    printf("-1\n");
    exit(0);
  }
  long long ans = max(Calc(px, 0), Calc(px, 1));
  if (ans == -1) return 0;
  return ans * d + px;
}
int main() {
  scanf("%lld%lld", &n, &m);
  d = Ex_gcd(n, m, invn, invm);
  n /= d;
  m /= d;
  if (d > N) {
    printf("-1\n");
    return 0;
  }
  scanf("%lld", &cnt_boy);
  long long x;
  for (int i = 1; i <= cnt_boy; i++) {
    scanf("%lld", &x);
    v[x % d].push_back(x / d);
    mp1[x] = 1;
  }
  scanf("%lld", &cnt_girl);
  for (int i = 1; i <= cnt_girl; i++) {
    scanf("%lld", &x);
    v[x % d].push_back(x / d);
    mp2[x] = 1;
  }
  for (int i = 0; i < d; i++) ans = max(ans, work(i));
  printf("%lld\n", ans);
  return 0;
}
