#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long int LINF = 0x3f3f3f3f3f3f3f3fll;
const long double pi = acos(-1);
const int MOD = 1e9 + 9;
int v[1101];
vector<vector<vector<vector<int> > > > dp;
int n, p, k;
int custo(int pos, int x1, int x2, int quem) {
  int r = 0;
  for (int i = 0; i < k; i++) {
    if (i >= x1 and quem & 1) r += (v[i + pos] == 1);
    if (i >= x2 and quem & 2) r += (v[i + pos] == 2);
    if (i >= x1 and i >= x2) r += (v[i + pos] == 3);
  }
  return r;
}
int solve(int i, int p, int x, int y) {
  if (p < 0) return -INF;
  if (i > n) return 0;
  if (dp[i][p][x][y] != -1) return dp[i][p][x][y];
  int ret = 0;
  ret = max(ret, solve(i + 1, p, max(x - 1, 0), max(y - 1, 0)));
  if (x == 0)
    ret =
        max(ret, solve(i + 1, p - 1, k - 1, max(y - 1, 0)) + custo(i, x, y, 1));
  if (y == 0)
    ret =
        max(ret, solve(i + 1, p - 1, max(x - 1, 0), k - 1) + custo(i, x, y, 2));
  if (x == 0 and y == 0)
    ret = max(ret, solve(i + 1, p - 2, k - 1, k - 1) + custo(i, x, y, 3));
  return dp[i][p][x][y] = ret;
}
int main() {
  scanf("%d%d%d", &n, &p, &k);
  int n1;
  scanf("%d", &n1);
  if (p <= 2 * ((n + k - 1) / k)) {
    dp.resize(n + 1,
              vector<vector<vector<int> > >(
                  p + 1, vector<vector<int> >(k + 1, vector<int>(k + 1, -1))));
  }
  while (n1--) {
    int x;
    scanf("%d", &x);
    v[x] |= 1;
  }
  scanf("%d", &n1);
  while (n1--) {
    int x;
    scanf("%d", &x);
    v[x] |= 2;
  }
  if (p * k > 2 * ((n + k - 1))) {
    int r = 0;
    for (int i = 0; i <= n; i++) r += (v[i] > 0);
    printf("%d\n", r);
    return 0;
  }
  printf("%d\n", solve(1, p, 0, 0));
  return 0;
}
