#include <bits/stdc++.h>
using namespace std;
long long pwr(long long base, long long p, long long mod) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    p /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
const int N = 200002;
int n, k, m, sz[5];
long long arr[4][N], ps[4][N];
bool yolo_a[N], yolo_b[N];
int cc, revmap[N];
map<int, int> compress;
long long tree[2][4 * N];
void update(int node, int s, int e, int pos, int val) {
  if (s > e || pos < s || pos > e) return;
  if (s == e) {
    tree[0][node] += val;
    tree[1][node] = revmap[s] * tree[0][node];
    return;
  }
  int mid = (s + e) / 2;
  update((2 * (node)), s, mid, pos, val);
  update((2 * (node) + 1), mid + 1, e, pos, val);
  tree[0][node] = tree[0][(2 * (node))] + tree[0][(2 * (node) + 1)];
  tree[1][node] = tree[1][(2 * (node))] + tree[1][(2 * (node) + 1)];
}
long long query(int node, int s, int e, int k) {
  if (k <= 0) return 0;
  if (tree[0][node] < k) return (long long)1e15;
  if (s == e) return revmap[s] * k;
  int mid = (s + e) / 2;
  if (tree[0][(2 * (node))] >= k) return query((2 * (node)), s, mid, k);
  return tree[1][(2 * (node))] +
         query((2 * (node) + 1), mid + 1, e, k - tree[0][(2 * (node))]);
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  vector<int> storage;
  storage.resize(n + 1);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &storage[i]);
    compress[storage[i]];
  }
  cc = 0;
  for (auto &it : compress) {
    it.second = ++cc;
    revmap[cc] = it.first;
  }
  int x;
  scanf("%d", &x);
  int aa = 0, bb = 0;
  while (x--) {
    int p;
    scanf("%d", &p);
    yolo_a[p] = true;
    aa++;
  }
  scanf("%d", &x);
  while (x--) {
    int p;
    scanf("%d", &p);
    yolo_b[p] = true;
    bb++;
  }
  if (aa < k || bb < k) {
    printf("-1\n");
    return 0;
  }
  for (int i = 1; i <= n; i++)
    if (yolo_a[i] && yolo_b[i]) {
      arr[2][++sz[2]] = storage[i];
    } else if (yolo_a[i]) {
      arr[0][++sz[0]] = storage[i];
    } else if (yolo_b[i]) {
      arr[1][++sz[1]] = storage[i];
    } else {
      arr[3][++sz[3]] = storage[i];
    }
  for (int j = 0; j < 3; j++) {
    sort(arr[j] + 1, arr[j] + sz[j] + 1);
    for (int i = 1; i <= sz[j]; i++) {
      ps[j][i] = ps[j][i - 1] + arr[j][i];
    }
  }
  int atleast = 0;
  if (min(sz[0], sz[1]) < k) {
    atleast = k - min(sz[0], sz[1]);
  }
  if (atleast > sz[2]) {
    printf("-1\n");
    return 0;
  }
  for (int i = 1; i <= sz[3]; i++) update(1, 1, cc, compress[arr[3][i]], 1);
  for (int i = 1; i <= sz[2]; i++) update(1, 1, cc, compress[arr[2][i]], 1);
  for (int i = k + 1; i <= sz[0]; i++) update(1, 1, cc, compress[arr[0][i]], 1);
  for (int i = k + 1; i <= sz[1]; i++) update(1, 1, cc, compress[arr[1][i]], 1);
  long long ans = (long long)1e15;
  for (int i = 0; i <= m && i <= sz[2]; i++) {
    if (i != 0) {
      update(1, 1, cc, compress[arr[2][i]], -1);
    }
    if (i >= k) {
      long long temp = ps[2][i] + query(1, 1, cc, m - i);
      ans = min(ans, temp);
    } else if (sz[0] >= k - i && sz[1] >= k - i && 2 * (k - i) + i <= m) {
      long long temp = ps[2][i] + ps[0][k - i] + ps[1][k - i] +
                       query(1, 1, cc, m - (i + k - i + k - i));
      ans = min(ans, temp);
    }
    if (sz[0] >= k - i) {
      update(1, 1, cc, compress[arr[0][k - i]], 1);
    }
    if (sz[1] >= k - i) {
      update(1, 1, cc, compress[arr[1][k - i]], 1);
    }
  }
  if (ans == (long long)1e15) ans = -1;
  printf("%lld\n", ans);
  return 0;
}
