#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const int maxn = 200500;
const int sz = 1 << 18;
int n, m, k, c[maxn];
vector<pair<int, int> > a, b, ab;
pair<int, int> shr[maxn];
void scan() {
  cin >> n >> m >> k;
  for (int i = 0; i < (int)(n); ++i) {
    cin >> c[i];
    shr[i] = {c[i], i};
  }
  int q;
  cin >> q;
  a.resize(q);
  for (int i = 0; i < (int)(q); ++i) {
    cin >> a[i].second;
    --a[i].second;
    a[i].first = c[a[i].second];
  }
  set<pair<int, int> > com((a).begin(), (a).end());
  cin >> q;
  b.resize(q);
  for (int i = 0; i < (int)(q); ++i) {
    cin >> b[i].second;
    --b[i].second;
    b[i].first = c[b[i].second];
    if (com.count(b[i])) ab.push_back(b[i]);
  }
  com = set<pair<int, int> >((ab).begin(), (ab).end());
  a.erase(remove_if((a).begin(), (a).end(),
                    [&com](const pair<int, int>& p) { return com.count(p); }),
          a.end());
  b.erase(remove_if((b).begin(), (b).end(),
                    [&com](const pair<int, int>& p) { return com.count(p); }),
          b.end());
}
pair<int, long long> rmq[sz * 2];
pair<int, long long> add(pair<int, long long> a, pair<int, long long> b) {
  return pair<int, long long>{a.first + b.first, a.second + b.second};
}
void add(int i, int x) {
  i += sz;
  if (x == -1)
    rmq[i] = {0, 0};
  else
    rmq[i] = {1, x};
  for (i /= 2; i; i /= 2) {
    rmq[i] = add(rmq[i * 2], rmq[i * 2 + 1]);
  }
}
long long get(int need) {
  if (need < 0 || need > rmq[1].first) return inf;
  if (need == 0) return 0;
  int v = 1;
  long long res = 0;
  while (v < sz) {
    if (rmq[v * 2].first >= need) {
      v *= 2;
    } else {
      need -= rmq[v * 2].first;
      res += rmq[v * 2].second;
      v = v * 2 + 1;
    }
  }
  assert(rmq[v].first == 1);
  assert(need == 1);
  res += rmq[v].second;
  return res;
}
void solve() {
  if (k > m) {
    cout << "-1\n";
    return;
  }
  sort(shr, shr + n);
  for (auto& kv : a) kv.second = lower_bound(shr, shr + n, kv) - shr;
  for (auto& kv : b) kv.second = lower_bound(shr, shr + n, kv) - shr;
  for (auto& kv : ab) kv.second = lower_bound(shr, shr + n, kv) - shr;
  sort((a).begin(), (a).end());
  sort((b).begin(), (b).end());
  sort((ab).begin(), (ab).end());
  for (int i = 0; i < (int)(n); ++i)
    add(lower_bound(shr, shr + n, pair<int, int>{c[i], i}) - shr, c[i]);
  long long best = inf;
  long long cur = 0;
  for (int i = 0; i < (int)(min(k, (int)ab.size())); ++i) {
    add(ab[i].second, -1);
    cur += ab[i].first;
  }
  int na = k - min(k, (int)ab.size());
  if ((int)a.size() < na || (int)b.size() < na) {
    cout << "-1\n";
    return;
  }
  for (int i = 0; i < (int)(na); ++i) {
    add(a[i].second, -1);
    add(b[i].second, -1);
    cur += a[i].first;
    cur += b[i].first;
  }
  for (int comm = min(k, (int)ab.size()); comm >= 0; --comm) {
    int na = k - comm;
    if ((int)a.size() < na || (int)b.size() < na) break;
    if (comm + na * 2 > m) break;
    best = min(best, cur + get(m - comm - na * 2));
    if ((int)a.size() <= na || (int)b.size() <= na) break;
    add(a[na].second, -1);
    add(b[na].second, -1);
    cur += a[na].first;
    cur += b[na].first;
    if (comm == 0) break;
    add(ab[comm - 1].second, ab[comm - 1].first);
    cur -= ab[comm - 1].first;
  }
  if (best == inf)
    cout << -1 << "\n";
  else
    cout << best << "\n";
}
int main() {
  ios::sync_with_stdio(false);
  scan();
  solve();
  return 0;
}
