#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
const long long INF = 1e18;
struct Tournament {
  long long a[4 * MAXN];
  int cnt[4 * MAXN];
  int off;
  void init(int n) {
    for (off = 1; off <= n; off *= 2)
      ;
    memset(a, 0, sizeof(a));
    memset(cnt, 0, sizeof(cnt));
  }
  void update(int i, long long val) {
    i += off;
    a[i] = val;
    cnt[i] = 1;
    for (i /= 2; i > 0; i /= 2) {
      a[i] = a[2 * i] + a[2 * i + 1];
      cnt[i] = cnt[2 * i] + cnt[2 * i + 1];
    }
  }
  long long sum(int i, int lo, int hi, int k) {
    if (k == 0) return 0;
    if (k == cnt[i]) return a[i];
    if (hi - lo == 1) return a[i];
    if (cnt[2 * i] >= k) return sum(2 * i, lo, (lo + hi) / 2, k);
    return a[2 * i] + sum(2 * i + 1, (lo + hi) / 2, hi, k - cnt[2 * i]);
  }
  long long Sum(int k) {
    if (k <= 0) return 0;
    return sum(1, 0, off, k);
  }
} t;
int n, m, k, c[MAXN];
vector<int> id[2];
int f[MAXN], pos[MAXN];
long long sol = INF, br = INF;
vector<int> v0, v1, v2, v_b, idx;
int flag[MAXN];
bool cmp(int i, int j) { return c[i] < c[j]; }
void brute() {
  br = INF;
  for (int a = (0); a < ((int)v_b.size() + 1); ++a) {
    for (int t1 = (0); t1 < ((int)v1.size() + 1); ++t1)
      for (int t2 = (0); t2 < ((int)v2.size() + 1); ++t2) {
        if (a + t1 < k) continue;
        if (a + t2 < k) continue;
        int r = m - a - t1 - t2;
        if (r < 0) continue;
        long long tmp = 0;
        for (int i = (0); i < (a); ++i) tmp += c[v_b[i]];
        for (int i = (0); i < (t1); ++i) tmp += c[v1[i]];
        for (int i = (0); i < (t2); ++i) tmp += c[v2[i]];
        for (int i = (0); i < (r); ++i) tmp += c[v0[i]];
        br = min(br, tmp);
      }
  }
  if (br == INF) br = -1;
}
void gen() {
  n = 5;
  m = 1 + rand() % 5;
  k = 1 + rand() % 5;
  printf("%d %d %d\n", n, m, k);
  for (int i = (0); i < (n); ++i) c[i] = 1 + rand() % 5;
  for (int i = (0); i < (n); ++i) {
    printf("%d ", c[i]);
  }
  printf("\n");
  for (int x = (0); x < (2); ++x) {
    int l;
    l = 1 + rand() % 5;
    printf("%d\n", l);
    int arr[MAXN];
    for (int j = (0); j < (n); ++j) arr[j] = j + 1;
    random_shuffle(arr, arr + n);
    id[x].resize(l);
    for (int j = (0); j < (l); ++j) {
      id[x][j] = arr[j];
      printf("%d ", id[x][j]);
      --id[x][j];
      ++f[id[x][j]];
      flag[id[x][j]] = x;
    }
    printf("\n");
  }
}
void load() {
  scanf("%d %d %d", &n, &m, &k);
  t.init(n + 1);
  for (int i = (0); i < (n); ++i) scanf("%d", &c[i]);
  for (int x = (0); x < (2); ++x) {
    int l;
    scanf("%d", &l);
    id[x].resize(l);
    for (int j = (0); j < (l); ++j) {
      scanf("%d", &id[x][j]);
      --id[x][j];
      ++f[id[x][j]];
      flag[id[x][j]] = x;
    }
  }
}
int main(void) {
  load();
  for (int x = (0); x < (n); ++x)
    if (f[x] == 0)
      v0.push_back(x);
    else if (f[x] == 2)
      v_b.push_back(x);
    else {
      if (flag[x] == 0)
        v1.push_back(x);
      else
        v2.push_back(x);
    }
  sort(v0.begin(), v0.end(), cmp);
  sort(v1.begin(), v1.end(), cmp);
  sort(v2.begin(), v2.end(), cmp);
  sort(v_b.begin(), v_b.end(), cmp);
  for (int i = (0); i < (n); ++i) idx.push_back(i);
  sort(idx.begin(), idx.end(), cmp);
  for (int i = (0); i < (n); ++i) pos[idx[i]] = i;
  for (int j : v0) t.update(pos[j], c[j]);
  for (int i = (k); i < ((int)v1.size()); ++i) t.update(pos[v1[i]], c[v1[i]]);
  for (int i = (k); i < ((int)v2.size()); ++i) t.update(pos[v2[i]], c[v2[i]]);
  long long tot_a = 0, tot1 = 0, tot2 = 0;
  for (int i = (0); i < (min((int)v1.size(), k)); ++i) tot1 += c[v1[i]];
  for (int i = (0); i < (min((int)v2.size(), k)); ++i) tot2 += c[v2[i]];
  int ptr = k - 1;
  if (m >= 2 * k && (int)v1.size() >= k && (int)v2.size() >= k &&
      t.cnt[1] >= m - 2 * k) {
    sol = min(sol, t.Sum(m - 2 * k) + tot1 + tot2);
  }
  for (int a = (1); a < ((int)v_b.size() + 1); ++a) {
    tot_a += c[v_b[a - 1]];
    if (ptr >= 0 && ptr < (int)v1.size()) {
      t.update(pos[v1[ptr]], c[v1[ptr]]);
      tot1 -= c[v1[ptr]];
    }
    if (ptr >= 0 && ptr < (int)v2.size()) {
      t.update(pos[v2[ptr]], c[v2[ptr]]);
      tot2 -= c[v2[ptr]];
    }
    --ptr;
    ;
    if ((int)v1.size() >= k - a && (int)v2.size() >= k - a &&
        m >= a + max(0, 2 * (k - a)) &&
        t.cnt[1] >= m - a - max(0, 2 * (k - a))) {
      int rest = m - max(0, 2 * (k - a)) - a;
      long long sumt = t.Sum(rest);
      sol = min(sol, sumt + tot_a + tot1 + tot2);
    }
  }
  if (sol == INF) sol = -1;
  printf("%lld\n", sol);
  return 0;
  return 0;
}
