#include <bits/stdc++.h>
using namespace std;
pair<int, int> g1[300000], g2[300000], g3[300000], g4[300000], g5[300000];
map<int, bool> M1, M2;
int i, j, k, k1, k2, k3, kk1, kk2, m, n, phi_m, phi_n, inv_m, inv_n, t, w;
long long s;
inline bool cmp(pair<int, int> x, pair<int, int> y) {
  return x.first % w < y.first % w;
}
inline int gcd(int x, int y) {
  if (!y)
    return x;
  else
    return gcd(y, x % y);
}
inline int getphi(int x) {
  int t = x;
  for (int i = 2; i * i <= x; i++)
    if (!(x % i)) {
      t = t / i * (i - 1);
      while (!(x % i)) x = x / i;
    }
  if (x > 1) t = t / x * (x - 1);
  return t;
}
inline int power(int x, int y, int p) {
  int s = 1;
  for (int i = 30; i >= 0; i--) {
    s = 1LL * s * s % p;
    if (y & (1 << i)) s = 1LL * s * x % p;
  }
  return s;
}
int main() {
  scanf("%d%d", &n, &m);
  scanf("%d", &kk1), k1 = kk1;
  for (i = 1; i <= k1; i++)
    scanf("%d", &t), g1[i] = g4[i] = make_pair(t, t), M1[t] = 1;
  sort(g4 + 1, g4 + kk1 + 1);
  scanf("%d", &kk2), k2 = kk2;
  for (i = 1; i <= k2; i++)
    scanf("%d", &t), g2[i] = g5[i] = make_pair(t, t), M2[t] = 1;
  sort(g5 + 1, g5 + kk2 + 1);
  for (i = 1; i <= kk1; i++)
    k2++, g2[k2] = make_pair(g1[i].first % m, g1[i].second);
  for (i = 1; i <= kk2; i++)
    k1++, g1[k1] = make_pair(g2[i].first % n, g2[i].second);
  sort(g1 + 1, g1 + k1 + 1);
  k3 = 1, g3[1] = g1[1];
  for (i = 2; i <= k1; i++)
    if (g1[i].first != g1[i - 1].first) k3++, g3[k3] = g1[i];
  k1 = k3;
  for (i = 1; i <= k1; i++) g1[i] = g3[i];
  sort(g2 + 1, g2 + k2 + 1);
  k3 = 1, g3[1] = g2[1];
  for (i = 2; i <= k2; i++)
    if (g2[i].first != g2[i - 1].first) k3++, g3[k3] = g2[i];
  k2 = k3;
  for (i = 1; i <= k2; i++) g2[i] = g3[i];
  w = gcd(n, m);
  n = n / w, m = m / w;
  phi_n = getphi(n), phi_m = getphi(m);
  inv_n = power(n, phi_m - 1, m), inv_m = power(m, phi_n - 1, n);
  if (k1 == n * w) {
    for (i = 1; i <= kk2; i++)
      if (!M1[g5[i].second % (n * w)])
        s = max(s, (long long)g5[i].second), M1[g5[i].second % (n * w)] = 1;
  } else {
    sort(g1 + 1, g1 + k1 + 1, cmp);
    for (i = 1, j = 1, t = 0; i <= k1; i = j, t++) {
      for (; (j <= k1) && (g1[i].first % w == g1[j].first % w); j++)
        ;
      for (k3 = 0, k = i; k < j; k++)
        k3++, g3[k3].first = g1[k].first / w, g3[k3].second = g1[k].second;
      for (k = 1; k <= k3; k++) g3[k].first = 1LL * g3[k].first * inv_m % n;
      sort(g3 + 1, g3 + k3 + 1);
      for (k = 1; k < k3; k++)
        s = max(s, g3[k].second +
                       1LL * (g3[k + 1].first - g3[k].first - 1) * m * w);
      s = max(s, g3[k3].second +
                     1LL * (n - g3[k3].first + g3[1].first - 1) * m * w);
    }
    if (t != w) return printf("-1"), 0;
  }
  if (k2 == m * w) {
    for (i = 1; i <= kk1; i++)
      if (!M2[g4[i].second % (m * w)])
        s = max(s, (long long)g4[i].second), M2[g4[i].second % (m * w)] = 1;
  } else {
    sort(g2 + 1, g2 + k2 + 1, cmp);
    for (i = 1, j = 1, t = 0; i <= k2; i = j, t++) {
      for (; (j <= k2) && (g2[i].first % w == g2[j].first % w); j++)
        ;
      for (k3 = 0, k = i; k < j; k++)
        k3++, g3[k3].first = g2[k].first / w, g3[k3].second = g2[k].second;
      for (k = 1; k <= k3; k++) g3[k].first = 1LL * g3[k].first * inv_n % m;
      sort(g3 + 1, g3 + k3 + 1);
      for (k = 1; k < k3; k++)
        s = max(s, g3[k].second +
                       1LL * (g3[k + 1].first - g3[k].first - 1) * n * w);
      s = max(s, g3[k3].second +
                     1LL * (m - g3[k3].first + g3[1].first - 1) * n * w);
    }
    if (t != w) return printf("-1"), 0;
  }
  printf("%I64d", s);
  return 0;
}
