#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void chkmax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void chkmin(T &a, T b) {
  if (a > b) a = b;
}
inline int read() {
  int sum = 0, p = 1;
  char ch = getchar();
  while (!(('0' <= ch && ch <= '9') || ch == '-')) ch = getchar();
  if (ch == '-') p = -1, ch = getchar();
  while ('0' <= ch && ch <= '9') sum = sum * 10 + ch - 48, ch = getchar();
  return sum * p;
}
const int maxn = 2e5 + 20;
int n, m, k;
int val[maxn], sx[maxn], tx;
int col[maxn];
vector<int> AB;
vector<int> A, B;
struct node {
  int s;
  long long s1;
  inline void Merge(node lc, node rc) {
    s = lc.s + rc.s;
    s1 = lc.s1 + rc.s1;
  }
};
node c[1 << 20];
void update(int x, int d, int o, int l, int r) {
  c[o].s += d;
  c[o].s1 += d * sx[x];
  if (l == r) return;
  int mid = l + r >> 1;
  if (x <= mid)
    update(x, d, (o << 1), l, mid);
  else
    update(x, d, (o << 1 | 1), mid + 1, r);
}
inline bool cmp(int x, int y) { return val[x] < val[y]; }
inline void init() {
  n = read();
  m = read();
  k = read();
  for (int i = (1), _end_ = (n); i <= _end_; i++)
    val[i] = read(), sx[++tx] = val[i];
  int ka, kb;
  ka = read();
  for (int i = (1), _end_ = (ka); i <= _end_; i++) col[read()] |= 1;
  kb = read();
  for (int i = (1), _end_ = (kb); i <= _end_; i++) col[read()] |= 2;
  if (ka < k || kb < k) puts("-1"), exit(0);
  sort(sx + 1, sx + tx + 1);
  tx = unique(sx + 1, sx + tx + 1) - (sx + 1);
  for (int i = (1), _end_ = (n); i <= _end_; i++)
    val[i] = lower_bound(sx + 1, sx + tx + 1, val[i]) - sx;
  for (int i = (1), _end_ = (n); i <= _end_; i++) {
    if (col[i] == 0)
      update(val[i], 1, 1, 1, tx);
    else if (col[i] == 1)
      A.push_back(i);
    else if (col[i] == 2)
      B.push_back(i);
    else
      AB.push_back(i);
  }
  sort(A.begin(), A.end(), cmp);
  sort(B.begin(), B.end(), cmp);
  sort(AB.begin(), AB.end(), cmp);
}
long long All;
long long ans;
long long query(int k, int o, int l, int r) {
  if (l == r) return (long long)k * sx[l];
  int mid = l + r >> 1;
  if (c[(o << 1)].s >= k)
    return query(k, (o << 1), l, mid);
  else
    return c[(o << 1)].s1 + query(k - c[(o << 1)].s, (o << 1 | 1), mid + 1, r);
}
inline void doing() {
  int j = min(min((int)A.size(), (int)B.size()), k) - 1;
  for (int i = (0), _end_ = (j); i <= _end_; i++)
    All += sx[val[A[i]]], All += sx[val[B[i]]];
  for (int i = (j + 1), _end_ = (n); i <= _end_; i++) {
    if (i < (int)A.size()) update(val[A[i]], 1, 1, 1, tx);
    if (i < (int)B.size()) update(val[B[i]], 1, 1, 1, tx);
  }
  for (int i = (0), _end_ = (k - j - 2); i <= _end_; i++) All += sx[val[AB[i]]];
  for (int i = (k - j - 1), _end_ = ((int)AB.size() - 1); i <= _end_; i++)
    update(val[AB[i]], 1, 1, 1, tx);
  ans = 1ll << 60;
  if (k + j + 1 <= m) chkmin(ans, All + query(m - k - j - 1, 1, 1, tx));
  for (int i = (k - j - 1), _end_ = (min((int)AB.size() - 1, k - 1));
       i <= _end_; i++) {
    All += sx[val[AB[i]]];
    update(val[AB[i]], -1, 1, 1, tx);
    update(val[A[j]], 1, 1, 1, tx);
    All -= sx[val[A[j]]];
    update(val[B[j]], 1, 1, 1, tx);
    All -= sx[val[B[j]]];
    j--;
    if (k + j + 1 <= m) chkmin(ans, All + query(m - k - j - 1, 1, 1, tx));
  }
  if (ans != (1ll << 60))
    printf("%lld\n", ans);
  else
    puts("-1");
}
int main() {
  init();
  doing();
  return 0;
}
