#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const long long INF = 1LL << 60;
int N, M, K, bln[MAXN], reidx[MAXN];
long long C[MAXN];
vector<pair<long long, long long> > vec[4];
vector<pair<int, int> > seq;
struct SegmentTree {
  struct Node {
    int cnt;
    long long sum;
  } tree[MAXN * 4];
  void upd(int l, int r, int x, long long v, int id) {
    if (l == r) {
      if (v < 0)
        tree[id].cnt--;
      else
        tree[id].cnt++;
      tree[id].sum += v;
      return;
    }
    int m = (l + r) / 2, lc = id * 2, rc = id * 2 + 1;
    if (x <= m)
      upd(l, m, x, v, lc);
    else
      upd(m + 1, r, x, v, rc);
    tree[id].sum = tree[lc].sum + tree[rc].sum;
    tree[id].cnt = tree[lc].cnt + tree[rc].cnt;
  }
  long long qry(int l, int r, int k, int id) {
    if (k <= 0) return 0;
    if (tree[id].cnt < k) return INF;
    if (tree[id].cnt == k) return tree[id].sum;
    int m = (l + r) / 2, lc = id * 2, rc = id * 2 + 1;
    if (tree[lc].cnt >= k) return qry(l, m, k, lc);
    return tree[lc].sum + qry(m + 1, r, k - tree[lc].cnt, rc);
  }
  void add(pair<long long, long long> it) {
    long long v = it.first;
    int id = reidx[it.second];
    upd(0, N, id, v, 1);
  }
  void del(pair<long long, long long> it) {
    long long v = it.first;
    int id = reidx[it.second];
    upd(0, N, id, -v, 1);
  }
  long long qry(int k) {
    if (k < 0) return INF;
    if (k == 0) return 0;
    return qry(0, N, k, 1);
  }
} tree;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  ;
  cin >> N >> M >> K;
  for (int i = 0; i < (N); i++) {
    cin >> C[i];
    seq.push_back({C[i], i});
  }
  sort(begin(seq), end(seq));
  for (int i = 0; i < (N); i++) {
    reidx[seq[i].second] = i;
  }
  for (int p = (1); p <= (2); p++) {
    int m, x;
    cin >> m;
    while (m--) {
      cin >> x;
      x--;
      bln[x] |= p;
    }
  }
  for (int i = 0; i < (N); i++) {
    vec[bln[i]].push_back({C[i], i});
  }
  for (int i = 0; i < (4); i++) sort(begin(vec[i]), end(vec[i]));
  long long ans = INF;
  long long tot = 0;
  int sz = min(((int)((vec[3]).size())), M);
  for (int i = 0; i < (sz); i++) tot += vec[3][i].first;
  for (auto it : vec[0]) tree.add(it);
  int pos = K - sz;
  if (sz + max(0, pos) + max(0, pos) <= M and
      ((int)((vec[1]).size())) >= pos and ((int)((vec[2]).size())) >= pos) {
    for (int i = 0; i < (pos); i++) {
      tot += vec[1][i].first;
      tot += vec[2][i].first;
    }
    for (int i = (max(0, pos)); i <= (((int)((vec[1]).size())) - 1); i++)
      tree.add(vec[1][i]);
    for (int i = (max(0, pos)); i <= (((int)((vec[2]).size())) - 1); i++)
      tree.add(vec[2][i]);
    for (int i = (sz); i <= (((int)((vec[3]).size())) - 1); i++)
      tree.add(vec[3][i]);
    ans = min(ans, tot + tree.qry(M - max(0, pos) - max(0, pos) - sz));
    for (int i = sz - 1; i >= 0; i--) {
      if (pos >= ((int)((vec[1]).size())) or pos >= ((int)((vec[2]).size())))
        break;
      tot -= vec[3][i].first;
      tree.add(vec[3][i]);
      if (pos >= 0) {
        tot += vec[1][pos].first;
        tot += vec[2][pos].first;
        tree.del(vec[1][pos]);
        tree.del(vec[2][pos]);
      }
      pos++;
      ans = min(ans, tot + tree.qry(M - max(0, pos) - max(0, pos) - i));
    }
  }
  if (ans == INF) ans = -1;
  cout << ans << endl;
  return 0;
}
