#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 * 1000 + 7;
int c[MAXN];
bool likea[MAXN], likeb[MAXN];
struct node {
  node *l, *r;
  int size;
  int val;
  long long sum;
  int prior;
  node(int x) {
    l = NULL;
    r = NULL;
    size = 1;
    val = x;
    sum = x;
    prior = rand();
  }
};
long long getSum(node *v) {
  if (v == NULL) return 0;
  return v->sum;
}
int getSize(node *v) {
  if (v == NULL) return 0;
  return v->size;
}
void upd(node *v) {
  v->size = getSize(v->l) + getSize(v->r) + 1;
  v->sum = v->val + getSum(v->l) + getSum(v->r);
}
pair<node *, node *> splitVal(node *v, int x) {
  if (v == NULL) return make_pair(v, v);
  if (v->val <= x) {
    pair<node *, node *> tmp = splitVal(v->r, x);
    v->r = tmp.first;
    upd(v);
    return make_pair(v, tmp.second);
  } else {
    pair<node *, node *> tmp = splitVal(v->l, x);
    v->l = tmp.second;
    upd(v);
    return make_pair(tmp.first, v);
  }
}
pair<node *, node *> splitSize(node *v, int x) {
  if (v == NULL) return make_pair(v, v);
  int sizeL = getSize(v->l) + 1;
  if (sizeL <= x) {
    pair<node *, node *> tmp = splitSize(v->r, x - sizeL);
    v->r = tmp.first;
    upd(v);
    return make_pair(v, tmp.second);
  } else {
    pair<node *, node *> tmp = splitSize(v->l, x);
    v->l = tmp.second;
    upd(v);
    return make_pair(tmp.first, v);
  }
}
node *merge(node *l, node *r) {
  if (l == NULL) return r;
  if (r == NULL) return l;
  if (l->prior < r->prior) {
    l->r = merge(l->r, r);
    upd(l);
    return l;
  } else {
    r->l = merge(l, r->l);
    upd(r);
    return r;
  }
}
const long long INF = (long long)1e18;
long long s1[MAXN], s2[MAXN], sb[MAXN];
node *add(node *v, int x) {
  pair<node *, node *> tmp = splitVal(v, x);
  return merge(merge(tmp.first, new node(x)), tmp.second);
}
int main() {
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &c[i]);
  }
  int a;
  scanf("%d", &a);
  for (int i = 1; i <= a; i++) {
    int x;
    scanf("%d", &x);
    likea[x] = true;
  }
  int b;
  scanf("%d", &b);
  for (int i = 1; i <= b; i++) {
    int x;
    scanf("%d", &x);
    likeb[x] = true;
  }
  vector<int> o1, o2, both, bee;
  for (int i = 1; i <= n; i++) {
    if (likea[i] && likeb[i]) {
      both.push_back(c[i]);
    } else if (likea[i]) {
      o1.push_back(c[i]);
    } else if (likeb[i]) {
      o2.push_back(c[i]);
    } else {
      bee.push_back(c[i]);
    }
  }
  sort(o1.begin(), o1.end());
  sort(o2.begin(), o2.end());
  sort(both.begin(), both.end());
  for (int i = 0; i < (int)o1.size(); i++) {
    if (i != 0) {
      s1[i] = s1[i - 1];
    }
    s1[i] += o1[i];
  }
  for (int i = 0; i < (int)o2.size(); i++) {
    if (i != 0) {
      s2[i] = s2[i - 1];
    }
    s2[i] += o2[i];
  }
  for (int i = 0; i < (int)both.size(); i++) {
    if (i != 0) {
      sb[i] = sb[i - 1];
    }
    sb[i] += both[i];
  }
  int ptr1 = (int)o1.size() - 1, ptr2 = (int)o2.size() - 1;
  long long res = INF;
  node *tree = NULL;
  for (int i = 0; i < (int)bee.size(); i++) {
    tree = add(tree, bee[i]);
  }
  for (int i = 0; i <= (int)both.size(); i++) {
    int needOther = max(0, k - i);
    while (ptr1 >= 0 && ptr1 >= needOther) {
      tree = add(tree, o1[ptr1]);
      ptr1--;
    }
    while (ptr2 >= 0 && ptr2 >= needOther) {
      tree = add(tree, o2[ptr2]);
      ptr2--;
    }
    int needMore = m - i - 2 * needOther;
    if (needMore >= 0 && needMore <= getSize(tree) &&
        needOther <= (int)min(o1.size(), o2.size())) {
      pair<node *, node *> tmp = splitSize(tree, needMore);
      long long curres = 0;
      if (i > 0) {
        curres += sb[i - 1];
      }
      if (ptr1 >= 0) curres += s1[ptr1];
      if (ptr2 >= 0) curres += s2[ptr2];
      curres += getSum(tmp.first);
      tree = merge(tmp.first, tmp.second);
      res = min(res, curres);
    }
  }
  if (res == INF) res = -1;
  printf("%lld\n", res);
}
