#include <bits/stdc++.h>
using namespace std;
template <class T, class C>
void print(C name, T a) {
  cout << name << ": " << a << endl;
}
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
template <class T>
T lcm(T a, T b) {
  return a * b / gcd(a, b);
}
long long pow(long long a, long long b, long long p) {
  long long ans = 1;
  a %= p;
  while (b) {
    if (b & 1) ans = ans * a % p;
    a = a * a % p;
    b >>= 1;
  }
  return ans;
}
template <typename _Tp>
void read(_Tp &x) {
  char ch;
  bool flag = 0;
  x = 0;
  while (ch = getchar(), !isdigit(ch))
    if (ch == '-') flag = 1;
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  if (flag) x = -x;
}
template <class T>
void print(T x) {
  if (x < 0) {
    x = -x;
    putchar('-');
  }
  if (x > 9) print(x / 10);
  putchar(x % 10 + '0');
}
const long long mod = 1000000007;
const long long inf = 1e18;
long long add(long long x, long long t) {
  x %= mod;
  t %= mod;
  return (x + t) % mod;
}
long long del(long long ans, long long x) {
  ans %= mod;
  ans += mod;
  x %= mod;
  return (ans - x) % mod;
}
long long mul(long long ans, long long x) {
  ans %= mod;
  x %= mod;
  return (ans * x) % mod;
}
const int maxn = 1e6 + 20, N = 1e6 + 20, M = 200000 + 10;
int a[2][1010];
int dp[2][1010][55][55];
int ab(int x) {
  if (x > 0) return x;
  return 0;
}
int main() {
  int n, p, k;
  cin >> n >> p >> k;
  for (int t = 0; t <= 1; t++) {
    int num;
    cin >> num;
    a[t][0] = num;
    for (int i = 1; i <= num; i++) {
      int x;
      scanf("%d", &x);
      a[t][x] = 1;
    }
  }
  p = min(p, 2 * (n / k + (n % k ? 1 : 0)));
  memset(dp, -0x3f3f3f3f, sizeof(dp));
  dp[0][0][0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= p + 1; j++)
      for (int x = 0; x < k; x++)
        for (int y = 0; y < k; y++) {
          dp[i & 1][j][k - 1][ab(y - 1)] =
              max(dp[i & 1][j][k - 1][ab(y - 1)],
                  dp[~i & 1][j - 1][x][y] + (a[0][i] || y && a[1][i]));
          dp[i & 1][j][ab(x - 1)][k - 1] =
              max(dp[i & 1][j][ab(x - 1)][k - 1],
                  dp[~i & 1][j - 1][x][y] + (x && a[0][i] || a[1][i]));
          dp[i & 1][j - 1][ab(x - 1)][ab(y - 1)] =
              max(dp[i & 1][j - 1][ab(x - 1)][ab(y - 1)],
                  dp[~i & 1][j - 1][x][y] + (a[0][i] && x || a[1][i] && y));
        }
    memset(dp[~i & 1], -0x3f3f3f3f, sizeof(dp[~i & 1]));
  }
  int ans = -0x3f3f3f3f;
  for (int i = 0; i <= 1; i++)
    for (int j = 1; j <= p; j++)
      for (int x = 0; x <= k; x++)
        for (int y = 0; y <= k; y++) ans = max(ans, dp[i][j][x][y]);
  cout << ans << endl;
}
