#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
long long w[N], dis[N];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    que;
int n, m, nx, mx, cnt, now, a[N], c[N], v[N], nex[N], head[N];
void addedges(int x, int y, int z) {
  nex[++now] = head[x], v[now] = y;
  head[x] = now, w[now] = 1LL * z * m;
}
void check() {
  for (int i = 0, j = 1, k = 1; i < n; i++) {
    if ((j > nx || a[j] != i) && (k > mx || c[k] != i)) return;
    if (j <= nx && a[j] == i) j++;
    if (k <= mx && c[k] == i) k++;
  }
  int i, j;
  for (i = n - 1, j = nx; i >= m; i--) {
    if (a[j] != i || !j) printf("%d\n", i), exit(0);
    if (j && a[j] == i) j--;
  }
  for (int k = mx; ~i; i--) {
    if (a[j] != i || c[k] != i || !j || !k) printf("%d\n", i), exit(0);
    if (j && a[j] >= i) j--;
    if (k && c[k] >= i) k--;
  }
}
vector<int> b[N], id[N];
int gcd(int a, int b) {
  while (b) {
    int t = b;
    b = a % b, a = t;
  }
  return a;
}
void gg() {
  puts("-1");
  exit(0);
}
void exgcd(int a, int b, long long &x, long long &y) {
  if (!b)
    x = 1, y = 0;
  else {
    exgcd(b, a % b, y, x);
    y -= a / b * x;
  }
}
long long g, x, y;
int main() {
  scanf("%d%d", &n, &m);
  scanf("%d", &nx);
  for (int i = 1; i <= nx; i++) scanf("%d", &a[i]);
  scanf("%d", &mx);
  for (int i = 1; i <= mx; i++) scanf("%d", &c[i]);
  if (n < m) swap(n, m), swap(nx, mx), swap(a, c);
  sort(a + 1, a + nx + 1), sort(c + 1, c + mx + 1), check();
  g = gcd(n, m);
  if (g > nx + mx) gg();
  for (int i = 1; i <= mx; i++) a[++nx] = c[i];
  sort(a + 1, a + nx + 1), nx = unique(a + 1, a + nx + 1) - a - 1;
  int ng = n / g;
  exgcd(m / g, n / g, x, y), x = (x % ng + ng) % ng;
  memset(dis, 127, sizeof(dis)), cnt = nx;
  for (int i = 1; i <= nx; i++) {
    int k = a[i] % g, y = (a[i] - m + n) % n;
    b[k].push_back((y - k) / g * x % ng);
    id[k].push_back(nx + i), que.push(pair<long long, int>(dis[i] = a[i], i));
  }
  for (int i = 0; i < g; i++)
    if (!b[i].size())
      gg();
    else
      sort(b[i].begin(), b[i].end());
  for (int i = 1; i <= nx; i++) {
    int k = a[i] % g, si = b[k].size();
    int y = (a[i] - k) / g * x % ng;
    if (b[k][si - 1] < y)
      addedges(i, id[k][0], ng - y + b[k][0]);
    else {
      int d = lower_bound(b[k].begin(), b[k].end(), y) - b[k].begin();
      addedges(i, id[k][d], b[k][d] - y);
    }
  }
  long long ans = 0;
  while (!que.empty()) {
    pair<long long, int> x = que.top();
    que.pop();
    if (x.first > dis[x.second]) continue;
    for (int i = head[x.second]; i; i = nex[i])
      if (w[i] + x.first < dis[v[i]]) {
        dis[v[i]] = w[i] + x.first;
        que.push(pair<long long, int>(dis[v[i]], v[i]));
      }
    ans = max(ans, x.first);
  }
  printf("%lld\n", ans);
  return 0;
}
