#include <bits/stdc++.h>
using namespace std;
int ans[3][1010], dp[3][1010][55][55];
int n, p, k, r, s, x;
int teto(int a, int b) { return (a + b - 1) / b; }
int main() {
  while (scanf("%d %d %d", &n, &p, &k) != EOF) {
    memset(ans, 0, sizeof(ans));
    scanf("%d", &r);
    for (int i = 0; i < r; i++) {
      scanf("%d", &x);
      x--;
      ans[0][x] = 1;
    }
    scanf("%d", &s);
    for (int i = 0; i < s; i++) {
      scanf("%d", &x);
      x--;
      ans[1][x] = 1;
    }
    if (p >= 2 * teto(n, k)) {
      int cnt = 0;
      for (int i = 0; i < n; i++) {
        if (ans[0][i] == 1 || ans[1][i] == 1) {
          cnt++;
        }
      }
      printf("%d\n", cnt);
      continue;
    }
    int A = min(n, k), B = min(n, k);
    for (int pos = n; pos >= 0; pos--) {
      int pos1 = pos % 2, pos2 = (pos + 1) % 2;
      for (int used = 0; used <= p; used++) {
        for (int a = 0; a <= A; a++) {
          for (int b = 0; b <= B; b++) {
            if (pos == n) {
              dp[pos1][used][a][b] = 0;
            } else {
              int max_ =
                  dp[pos2][used][max(a - 1, 0)][max(b - 1, 0)] +
                  max((a >= 1) * (ans[0][pos]), (b >= 1) * (ans[1][pos]));
              if (used + 1 <= p) {
                max_ =
                    max(max_, dp[pos2][used + 1][k - 1][max(0, b - 1)] +
                                  max(ans[0][pos], (b >= 1) * (ans[1][pos])));
                max_ =
                    max(max_, dp[pos2][used + 1][max(a - 1, 0)][k - 1] +
                                  max((a >= 1) * (ans[0][pos]), ans[1][pos]));
              }
              if (used + 2 <= p) {
                max_ = max(max_, dp[pos2][used + 2][k - 1][k - 1]);
              }
              dp[pos1][used][a][b] = max_;
            }
          }
        }
      }
    }
    printf("%d\n", dp[0][0][0][0]);
  }
  return 0;
}
