#include <bits/stdc++.h>
using namespace std;
long long INF = 2e18;
int n, m;
vector<int> d[100000][2];
struct gcd_t {
  long long x, y, z;
} gg;
long long inv[2], sz[2];
gcd_t gcd(long long a, long long b) {
  if (b == 0) return (gcd_t){1, 0, a};
  gcd_t t = gcd(b, a % b);
  return (gcd_t){t.y, t.x - t.y * (a / b), t.z};
}
void fresh(long long& x, long long v) { x = min(x, v); }
void mii(map<int, long long>& mi, long long x, long long v) {
  if (mi.count(x))
    fresh(mi[x], v);
  else
    mi[x] = v;
}
void proccess(long long& now, map<int, long long>& mi, int round) {
  map<int, long long>::iterator it = mi.begin();
  while (it != mi.end()) {
    fresh(it->second, now);
    fresh(now, it->second);
    int me = it->first;
    it++;
    int you;
    if (it != mi.end())
      you = it->first;
    else
      you = mi.begin()->first + sz[round];
    now += (you - me) * sz[round ^ 1] * gg.z;
  }
}
long long f(vector<int> v[]) {
  long long res = -1;
  int n = ((int)(v[0]).size()) + ((int)(v[1]).size());
  n <<= 1;
  for (int round = 0; round < (2); ++round) {
    set<int> H;
    map<int, long long> mi;
    for (int k = 0; k < (2); ++k) {
      for (int i = 0; i < (((int)(v[k]).size())); ++i) {
        int me = v[k][i] * inv[round] % sz[round];
        if (k == round) H.insert(me);
        mii(mi, (me + sz[round] - 1) % sz[round], INF);
        mii(mi, me, v[k][i] * gg.z);
      }
    }
    long long now = INF;
    proccess(now, mi, round);
    proccess(now, mi, round);
    set<int>::iterator it1 = H.begin();
    map<int, long long>::iterator it2 = mi.begin();
    while (it2 != mi.end()) {
      while (it1 != H.end() && *it1 < it2->first) it1++;
      if (it1 == H.end() || *it1 != it2->first) res = max(res, it2->second);
      it2++;
    }
  }
  if (res == -1) return -INF;
  return res;
}
int main() {
  scanf("%d%d", &(n), &(m));
  gg = gcd(n, m);
  if (gg.z > 100000) {
    puts("-1");
    return 0;
  }
  sz[0] = n / gg.z;
  sz[1] = m / gg.z;
  inv[1] = (gg.x % sz[1] + sz[1]) % sz[1];
  inv[0] = (gg.y % sz[0] + sz[0]) % sz[0];
  for (int k = 0; k < (2); ++k) {
    int(m);
    scanf("%d", &m);
    for (int i = 0; i < (m); ++i) {
      int(x);
      scanf("%d", &x);
      d[x % gg.z][k].push_back(x / gg.z);
    }
  }
  for (int i = 0; i < (gg.z); ++i) {
    if (((int)(d[i][0]).size()) + ((int)(d[i][1]).size()) == 0) {
      puts("-1");
      return 0;
    }
  }
  long long an = 0;
  for (int i = 0; i < (gg.z); ++i) {
    an = max(an, f(d[i]) + i);
  }
  cout << an << endl;
  return 0;
}
