#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int exgcd(int a, int b, int& x, int& y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  int t = exgcd(b, a % b, y, x);
  y -= a / b * x;
  return t;
}
int calc(int a, int b, int p) {
  int x, y;
  int g = exgcd(a, p, x, y);
  if (b % g) return -1;
  x = (((long long)x * b / g) % p + p) % p;
  return x;
}
vector<pair<int, int> > tmp[200010];
long long calc(vector<int> vec, int n, int m) {
  int g = gcd(n, m);
  if (g > vec.size()) return -1;
  for (int i = 0; i < g; i++) tmp[i].clear();
  for (int i = 0; i < vec.size(); i++) {
    int x = vec[i];
    int r = x % g;
    int p = calc(m / g, x / g, n / g);
    tmp[r].push_back(make_pair(p, x));
  }
  long long ans = 0;
  for (int i = 0; i < g; i++) {
    if (!tmp[i].size()) return -1;
    sort(tmp[i].begin(), tmp[i].end());
    for (int j = 0; j < tmp[i].size(); j++) {
      int x = tmp[i][(j + 1) % tmp[i].size()].first;
      int y = tmp[i][j].first;
      int tim = (x - y - 1 + n / g) % (n / g);
      if (tim > 0) ans = max(ans, (long long)m * tim + tmp[i][j].second);
    }
  }
  return ans;
}
vector<int> b, g;
map<int, int> bb, gg;
vector<int> tmp1, tmp2;
int main() {
  long long ans = 0;
  int n, m;
  scanf("%d %d", &n, &m);
  int num;
  scanf("%d", &num);
  for (int i = 1; i <= num; i++) {
    int x;
    scanf("%d", &x);
    b.push_back(x);
    bb[x] = 1;
  }
  sort(b.begin(), b.end());
  scanf("%d", &num);
  for (int i = 1; i <= num; i++) {
    int x;
    scanf("%d", &x);
    g.push_back(x);
    gg[x] = 1;
  }
  sort(g.begin(), g.end());
  for (int i = 0; i < b.size(); i++) {
    int x = b[i];
    if (!gg.count(x % m))
      tmp2.push_back(x % m), gg[x % m] = 1, ans = max(ans, (long long)x);
  }
  for (int i = 0; i < g.size(); i++) {
    int x = g[i];
    if (!bb.count(x % n))
      tmp1.push_back(x % n), bb[x % n] = 1, ans = max(ans, (long long)x);
  }
  for (int i = 0; i < tmp2.size(); i++) g.push_back(tmp2[i]);
  for (int i = 0; i < tmp1.size(); i++) b.push_back(tmp1[i]);
  long long ans1 = calc(b, n, m), ans2 = calc(g, m, n);
  if (ans1 < 0 || ans2 < 0)
    printf("-1\n");
  else
    printf("%I64d\n", max(ans, max(ans1, ans2)));
  return 0;
}
