#include <bits/stdc++.h>
using namespace std;
const long long max_n = 200022, log_n = 32, max_m = 111, mod = 1000000007,
                inf = 1000000009;
const long long llinf = 2100000000000000LL;
struct tree {
  long long t[max_n * 4], cnt[max_n * 4];
  void merge(int v) {
    t[v] = t[v * 2] + t[v * 2 + 1];
    cnt[v] = cnt[v * 2] + cnt[v * 2 + 1];
  }
  void build(int v, pair<int, int> p[], int tl, int tr) {
    if (tl == tr) {
      t[v] = p[tl].first;
      cnt[v] = 1;
      return;
    }
    int mid = (tl + tr) / 2;
    build(v * 2, p, tl, mid);
    build(v * 2 + 1, p, mid + 1, tr);
    merge(v);
  }
  void update(int v, int tl, int tr, int pos, int val) {
    if (tl == tr) {
      t[v] = val;
      if (val == 0) {
        cnt[v] = 0;
      } else {
        cnt[v] = 1;
      }
      return;
    }
    int mid = (tl + tr) / 2;
    if (pos <= mid) {
      update(v * 2, tl, mid, pos, val);
    } else {
      update(v * 2 + 1, mid + 1, tr, pos, val);
    }
    merge(v);
  }
  long long get(int v, int tl, int tr, int sum) {
    if (cnt[v] < sum) {
      while (true) {
        tl = 5;
        tr = 6;
        sum = tl + tr / 2;
      }
    }
    if (sum <= 0) {
      return 0;
    }
    if (cnt[v] == sum) {
      return t[v];
    }
    int mid = (tl + tr) / 2;
    if (cnt[v * 2] >= sum) {
      return get(v * 2, tl, mid, sum);
    } else {
      return get(v * 2, tl, mid, cnt[v * 2]) +
             get(v * 2 + 1, mid + 1, tr, sum - cnt[v * 2]);
    }
  }
};
int n, a, b, m, k;
vector<int> v[4];
vector<long long> sum[4];
pair<int, int> c[max_n], p[max_n];
tree t;
void init() {
  cin >> n >> m >> k;
  for (int i = 0; i < n; ++i) {
    scanf("%d", &p[i].first);
    p[i].second = i;
  }
  cin >> a;
  for (int i = 0; i < a; ++i) {
    int g;
    scanf("%d", &g);
    c[g - 1].first = 1;
  }
  cin >> b;
  for (int i = 0; i < b; ++i) {
    int g;
    scanf("%d", &g);
    c[g - 1].second = 1;
  }
  sort(p, p + n);
  for (int i = 0; i < n; ++i) {
    int ii = p[i].second;
    int ind = c[ii].first * 2 + c[ii].second;
    v[ind].push_back(i);
    if (v[ind].size() > 1) {
      sum[ind].push_back(sum[ind].back() + p[i].first);
    } else {
      sum[ind].push_back(p[i].first);
    }
  }
}
int main() {
  init();
  if (m < k) {
    cout << "-1\n";
    return 0;
  }
  t.build(1, p, 0, n - 1);
  long long ans = llinf;
  for (int i = 0; i < k; ++i) {
    if (v[1].size() > i) {
      t.update(1, 0, n - 1, v[1][i], 0);
    }
    if (v[2].size() > i) {
      t.update(1, 0, n - 1, v[2][i], 0);
    }
  }
  if (v[1].size() >= k && v[2].size() >= k && m >= k * 2) {
    ans = sum[1][k - 1] + sum[2][k - 1] + t.get(1, 0, n - 1, m - k * 2);
  }
  for (int i = 0; i < min((int)v[3].size(), k); ++i) {
    t.update(1, 0, n - 1, v[3][i], 0);
    int num = k - i - 1;
    if (v[1].size() > num) {
      t.update(1, 0, n - 1, v[1][num], p[v[1][num]].first);
    }
    if (v[2].size() > num) {
      t.update(1, 0, n - 1, v[2][num], p[v[2][num]].first);
    }
    if (v[1].size() > num - 1 && v[2].size() > num - 1 &&
        m - i - 1 - num * 2 >= 0) {
      ans = min(ans, sum[1][num - 1] + sum[2][num - 1] + sum[3][i] +
                         t.get(1, 0, n - 1, m - i - 1 - num * 2));
    } else if (i == k - 1) {
      ans = min(ans, sum[3][i] + t.get(1, 0, n - 1, m - k));
    }
  }
  if (ans >= llinf) {
    cout << "-1\n";
    return 0;
  }
  cout << ans << endl;
  return 0;
}
