#include <bits/stdc++.h>
using namespace std;
long long tot[2];
vector<long long> r[2];
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long ax, ay;
void exgcd(long long a, long long b) {
  if (!b) {
    ax = 1, ay = 0;
    return;
  }
  exgcd(b, a % b);
  pair<long long, long long> fn = make_pair(ay, ax - (a / b) * ay);
  ax = fn.first, ay = fn.second;
}
long long ns;
vector<pair<long long, long long> > s[300007];
long long cal(long long tp) {
  for (long long i = 0; i < ns; i++) s[i].clear();
  long long ans = 0;
  sort(r[tp].begin(), r[tp].end());
  for (long long i = tot[tp] - 1; i >= 0; i--) {
    long long npl = lower_bound(r[tp].begin(), r[tp].end(), i) - r[tp].begin();
    if (npl == r[tp].size() || r[tp][npl] != i) {
      ans = i;
      break;
    }
  }
  exgcd(tot[tp] / ns, tot[tp ^ 1] / ns);
  long long nt = tot[tp] / ns;
  long long step = tot[tp ^ 1];
  long long bk = (ay % nt + nt) % nt;
  for (auto g : r[tp]) {
    long long nid = g % ns, ndis = (g - nid) / ns;
    s[nid].push_back(make_pair(ndis * bk % nt, g));
  }
  for (auto g : r[tp ^ 1]) {
    long long nid = g % ns, ndis = (g % tot[tp] - nid) / ns;
    s[nid].push_back(make_pair(ndis * bk % nt, g));
  }
  for (long long i = 0; i < ns; i++) {
    if (s[i].empty()) {
      printf("-1\n");
      exit(0);
    }
    sort(s[i].begin(), s[i].end());
    s[i].push_back(make_pair(s[i][0].first + tot[tp] / ns, 0));
    for (long long j = 0; j < s[i].size() - 1; j++) {
      long long nans =
          (s[i][j + 1].first - 1 - s[i][j].first) * step + s[i][j].second;
      if (s[i][j + 1].first - 1 > s[i][j].first) ans = max(ans, nans);
      if (s[i][j].second >= tot[tp]) ans = max(ans, s[i][j].second);
      s[i][j + 1].second = min(s[i][j + 1].second, nans + step);
    }
  }
  return ans;
}
int main() {
  cin >> tot[0] >> tot[1];
  ns = gcd(tot[0], tot[1]);
  if (ns > 3e5) {
    printf("-1\n");
    exit(0);
  }
  for (int i = 0; i < 2; i++) {
    int sz;
    cin >> sz;
    r[i].resize(sz);
    for (int j = 0; j < sz; j++) scanf("%lld", &r[i][j]);
    sort(r[i].begin(), r[i].end());
  }
  long long ans = max(cal(0), cal(1));
  cout << ans << endl;
  return 0;
}
