#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void minimize(X &x, const Y &y) {
  if (x > y) x = y;
}
template <class X, class Y>
void maximize(X &x, const Y &y) {
  if (x < y) x = y;
}
template <class T>
T Abs(const T &x) {
  return (x < 0 ? -x : x);
}
int numQuest, maxLook, limit, length;
bool haveA[1010], haveB[1010];
short *f[1010][55][55];
void init(void) {
  scanf("%d%d%d", &numQuest, &limit, &length);
  int t;
  scanf("%d", &t);
  for (int love = 0, _n = (t); love < _n; love = love + 1) {
    int x;
    scanf("%d", &x);
    haveA[x] = true;
  }
  scanf("%d", &t);
  for (int love = 0, _n = (t); love < _n; love = love + 1) {
    int x;
    scanf("%d", &x);
    haveB[x] = true;
  }
}
void optimize(void) {
  while (maxLook * length < numQuest) maxLook++;
  for (int i = 0, _n = (numQuest + 1); i < _n; i = i + 1)
    for (int j = 0, _n = (length); j < _n; j = j + 1)
      for (int k = 0, _n = (length); k < _n; k = k + 1)
        f[i][j][k] = new short[2 * maxLook + 1];
  for (int pos = 0, _n = (numQuest + 1); pos < _n; pos = pos + 1)
    for (int fillA = 0, _n = (length); fillA < _n; fillA = fillA + 1)
      for (int fillB = 0, _n = (length); fillB < _n; fillB = fillB + 1)
        for (int used = 0, _n = (2 * maxLook + 1); used < _n; used = used + 1)
          f[pos][fillA][fillB][used] = -1;
  f[0][0][0][0] = 0;
  for (int pos = 0, _n = (numQuest); pos < _n; pos = pos + 1)
    for (int fillA = 0, _n = (length); fillA < _n; fillA = fillA + 1)
      for (int fillB = 0, _n = (length); fillB < _n; fillB = fillB + 1)
        for (int used = 0, _n = (2 * maxLook + 1); used < _n; used = used + 1)
          if (f[pos][fillA][fillB][used] >= 0) {
            int cur = f[pos][fillA][fillB][used];
            maximize(f[pos + 1][max(fillA - 1, 0)][max(fillB - 1, 0)][used],
                     cur);
            if (haveA[pos + 1]) {
              int cost = pos + fillA >= pos + 1 ? 0 : 1;
              int newFillA =
                  pos + fillA >= pos + 1 ? max(fillA - 1, 0) : length - 1;
              if (used + cost <= 2 * maxLook)
                maximize(f[pos + 1][newFillA][max(fillB - 1, 0)][used + cost],
                         cur + 1);
            }
            if (haveB[pos + 1]) {
              int cost = pos + fillB >= pos + 1 ? 0 : 1;
              int newFillB =
                  pos + fillB >= pos + 1 ? max(fillB - 1, 0) : length - 1;
              if (used + cost <= 2 * maxLook)
                maximize(f[pos + 1][max(fillA - 1, 0)][newFillB][used + cost],
                         cur + 1);
            }
          }
  int res = 0;
  for (int used = 0, _n = (min(limit, 2 * maxLook) + 1); used < _n;
       used = used + 1)
    for (int fillA = 0, _n = (length); fillA < _n; fillA = fillA + 1)
      for (int fillB = 0, _n = (length); fillB < _n; fillB = fillB + 1)
        maximize(res, f[numQuest][fillA][fillB][used]);
  printf("%d\n", res);
}
int main(void) {
  init();
  optimize();
  return 0;
}
