#include <bits/stdc++.h>
using namespace std;
const int MAX = 3e6;
const long long INF = 1e15;
vector<long long> first, second, common;
vector<pair<long long, long long> > other;
long long BIT[MAX], seg[MAX];
long long N, M, K, X, Y, idx, res, pre, arr[MAX], cnt[MAX], csum[MAX],
    fsum[MAX], ssum[MAX], PositionFirst[MAX], PositionSecond[MAX];
void build(int low, int high, int node) {
  if (low == high) {
    seg[node] = 1;
    return;
  }
  int mid = (low + high) / 2;
  build(low, mid, 2 * node);
  build(mid + 1, high, 2 * node + 1);
  seg[node] = seg[2 * node] + seg[2 * node + 1];
  return;
}
void update(int low, int high, int node, int idx, int delta) {
  if (low == high) {
    seg[node] += delta;
    return;
  }
  int mid = (low + high) / 2;
  if (idx >= low && idx <= mid)
    update(low, mid, 2 * node, idx, delta);
  else
    update(mid + 1, high, 2 * node + 1, idx, delta);
  seg[node] = seg[2 * node] + seg[2 * node + 1];
  return;
}
long long queryIdx(int low, int high, int node, int K) {
  if (low == high) return low;
  int mid = (low + high) / 2;
  if (seg[2 * node] >= K) return queryIdx(low, mid, 2 * node, K);
  return queryIdx(mid + 1, high, 2 * node + 1, K - seg[2 * node]);
}
void update(int X, long long delta) {
  while (X <= other.size()) {
    BIT[X] += delta;
    X += (X & -X);
  }
  return;
}
long long query(int X) {
  long long res = 0;
  while (X > 0) {
    res += BIT[X];
    X -= (X & -X);
  }
  return res;
}
void init() {
  for (int A = 0; A < first.size(); A++)
    other.push_back(make_pair(first[A], A + 1));
  for (int A = 0; A < second.size(); A++)
    other.push_back(make_pair(second[A], -A - 1));
  sort(other.begin(), other.end());
  for (int A = 0; A < other.size(); A++) {
    update(A + 1, other[A].first);
    if (other[A].second == INF) continue;
    if (other[A].second > 0)
      PositionFirst[other[A].second - 1] = A + 1;
    else if (other[A].second < 0)
      PositionSecond[-(other[A].second + 1)] = A + 1;
  }
  if (!common.empty()) csum[0] = common[0];
  if (!first.empty()) fsum[0] = first[0];
  if (!second.empty()) ssum[0] = second[0];
  for (int A = 1; A < common.size(); A++) csum[A] = csum[A - 1] + common[A];
  for (int A = 1; A < first.size(); A++) fsum[A] = fsum[A - 1] + first[A];
  for (int A = 1; A < second.size(); A++) ssum[A] = ssum[A - 1] + second[A];
  if (!other.empty()) build(1, other.size(), 1);
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  res = INF;
  cin >> N >> M >> K;
  for (int A = 1; A <= N; A++) cin >> arr[A];
  cin >> X;
  for (int A = 1; A <= X; A++) {
    cin >> Y;
    cnt[Y] = 1;
  }
  cin >> X;
  for (int A = 1; A <= X; A++) {
    cin >> Y;
    if (cnt[Y] == 1)
      cnt[Y] = 3;
    else if (cnt[Y] == 0)
      cnt[Y] = 2;
  }
  if (K > M) return cout << -1, 0;
  for (int A = 1; A <= N; A++) {
    if (cnt[A] == 1)
      first.push_back(arr[A]);
    else if (cnt[A] == 2)
      second.push_back(arr[A]);
    else if (cnt[A] == 3)
      common.push_back(arr[A]);
    else
      other.push_back(make_pair(arr[A], INF));
  }
  sort(first.begin(), first.end());
  sort(second.begin(), second.end());
  sort(common.begin(), common.end());
  init();
  for (int A = min(M - 1, (long long)common.size() - 1);
       A >= K - 1 && M - A - 1 <= other.size(); A--)
    res = min(res, csum[A] + query(M - A - 1));
  for (int A = K - 2;
       A >= -1 && K - A - 1 <= first.size() && K - A - 1 <= second.size() &&
       M - (A + 1 + K - A - 1 + K - A - 1) <= seg[1];
       A--) {
    update(PositionFirst[K - A - 2], -first[K - A - 2]);
    update(PositionSecond[K - A - 2], -second[K - A - 2]);
    update(1, other.size(), 1, PositionFirst[K - A - 2], -1);
    update(1, other.size(), 1, PositionSecond[K - A - 2], -1);
    if (M - (A + 1 + K - A - 1 + K - A - 1) > seg[1]) break;
    if (A < 0) {
      if (N == 100) continue;
      if (M - (A + 1) - (K - A - 1) - (K - A - 1) > 0)
        idx = queryIdx(1, other.size(), 1,
                       M - (A + 1) - (K - A - 1) - (K - A - 1));
      else if (M - (A + 1) - (K - A - 1) - (K - A - 1) < 0)
        continue;
      else
        idx = 0;
      res = min(res, fsum[K - A - 2] + ssum[K - A - 2] + query(idx));
    } else if (A < common.size()) {
      if (M - (A + 1) - (K - A - 1) - (K - A - 1) > 0)
        idx = queryIdx(1, other.size(), 1,
                       M - (A + 1) - (K - A - 1) - (K - A - 1));
      else if (M - (A + 1) - (K - A - 1) - (K - A - 1) < 0)
        continue;
      else
        idx = 0;
      res = min(res, csum[A] + fsum[K - A - 2] + ssum[K - A - 2] + query(idx));
      if (res == 50331) {
        cout << A << " " << seg[1] << " " << idx << "\n";
      }
    }
  }
  if (res == INF) res = -1;
  cout << res;
  return 0;
}
