#include <bits/stdc++.h>
using namespace std;
const long long INF = 1000LL * 1000 * 1000 * 1000 * 1000 * 1000 + 123;
const int maxn = 200000 + 123;
int n, m, k;
int c[maxn];
bool ina[maxn], inb[maxn];
vector<int> a, b, both, rem;
bool cmp(const int i, const int j) { return c[i] < c[j]; }
void ReadData() {
  cin >> n >> m >> k;
  for (int i = 1, _b = n; i <= _b; ++i) cin >> c[i];
  int na;
  cin >> na;
  for (int i = 1, _b = na; i <= _b; ++i) {
    int x;
    cin >> x;
    ina[x] = true;
  }
  int nb;
  cin >> nb;
  for (int i = 1, _b = nb; i <= _b; ++i) {
    int x;
    cin >> x;
    inb[x] = true;
  }
}
class segmentTree {
 public:
  int l[maxn * 4], h[maxn * 4], leaf[maxn];
  long long sum[maxn * 4];
  int Size[maxn * 4];
  void buildTree(const int x, const int lo, const int hi) {
    l[x] = lo, h[x] = hi;
    if (lo == hi) {
      leaf[lo] = x;
      Size[x] = 1;
      sum[x] = c[rem[lo]];
    } else {
      int mid = (lo + hi) >> 1;
      buildTree((x << 1), lo, mid);
      buildTree(((x << 1) | 1), mid + 1, hi);
      Size[x] = Size[(x << 1)] + Size[((x << 1) | 1)];
      sum[x] = sum[(x << 1)] + sum[((x << 1) | 1)];
    }
  }
  void upd(int pos) {
    int x = leaf[pos];
    Size[x] = 0;
    sum[x] = 0;
    while (true) {
      x >>= 1;
      if (!x) break;
      Size[x] = Size[(x << 1)] + Size[((x << 1) | 1)];
      sum[x] = sum[(x << 1)] + sum[((x << 1) | 1)];
    }
  }
  long long getSum(const int x, const int u, const int v) {
    if (l[x] > v || h[x] < u) return 0;
    if (u <= l[x] && h[x] <= v) return sum[x];
    return getSum((x << 1), u, v) + getSum(((x << 1) | 1), u, v);
  }
  int findFirst(const int x, const int val) {
    if (l[x] == h[x]) return l[x];
    if (Size[(x << 1)] >= val) return findFirst((x << 1), val);
    return findFirst(((x << 1) | 1), val - Size[(x << 1)]);
  }
} tree;
int posRem[maxn];
long long prefBoth[maxn];
void init() {
  both.push_back(0);
  for (int i = 1, _b = n; i <= _b; ++i) {
    if (ina[i] && inb[i]) {
      both.push_back(i);
    } else
      rem.push_back(i);
    if (ina[i] && !inb[i]) {
      a.push_back(i);
    }
    if (inb[i] && !ina[i]) {
      b.push_back(i);
    }
  }
  sort(a.begin(), a.end(), cmp);
  sort(b.begin(), b.end(), cmp);
  sort(both.begin(), both.end(), cmp);
  sort(rem.begin(), rem.end(), cmp);
  while (((int)both.size()) > m + 1) both.pop_back();
  for (int i = 0; i < (int)rem.size(); i++) {
    posRem[rem[i]] = i;
  }
  if (((int)rem.size())) tree.buildTree(1, 0, (int)rem.size() - 1);
  prefBoth[0] = c[both[0]];
  for (int i = 1; i < (int)both.size(); i++) {
    prefBoth[i] = prefBoth[i - 1] + c[both[i]];
  }
}
void Process() {
  init();
  long long res = INF;
  int j = -1;
  long long totaladd = 0;
  for (int i = (int)both.size() - 1; i >= 0; i--) {
    while (i + j + 2 <= k && j + 1 < min(((int)a.size()), ((int)b.size()))) {
      j++;
      totaladd += c[a[j]];
      totaladd += c[b[j]];
      tree.upd(posRem[a[j]]);
      tree.upd(posRem[b[j]]);
    }
    if (i + 2 * (j + 1) <= m && i + j + 1 >= k) {
      long long t = totaladd + prefBoth[i];
      int p = m - (i + 2 * (j + 1));
      if (p <= tree.Size[1] && p >= 1 && ((int)rem.size())) {
        int z = tree.findFirst(1, p);
        t += tree.getSum(1, 0, z);
      } else if (p >= 1 && (((int)rem.size()) == 0 || p > tree.Size[1]))
        t = INF;
      res = min(res, t);
    }
  }
  if (res == INF) res = -1;
  cout << res << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ReadData();
  Process();
  return 0;
}
