#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, cap, cost, rev;
};
int INF = 1e9;
const int MAX_V = 10010;
vector<edge> G[MAX_V];
int dist[MAX_V];
int prevv[MAX_V], preve[MAX_V];
int inq[MAX_V] = {
    0,
};
int n, s, p;
void addEdge(int from, int to, int cap, int cost) {
  G[from].push_back({to, cap, cost, (int)G[to].size()});
  G[to].push_back({from, 0, -cost, (int)G[from].size() - 1});
}
pair<int, int> min_cost_flow(int s, int t) {
  int res = 0;
  int total = 0;
  queue<int> q;
  while (true) {
    memset(dist, 0x3f3f3f, sizeof(int) * (n + 4));
    dist[s] = 0;
    q.push(s);
    inq[s] = 1;
    while (!q.empty()) {
      int here = q.front();
      q.pop();
      inq[here] = 0;
      for (int i = 0; i < G[here].size(); i++) {
        edge &e = G[here][i];
        if (e.cap > 0 && dist[e.to] > dist[here] + e.cost) {
          dist[e.to] = dist[here] + e.cost;
          prevv[e.to] = here;
          preve[e.to] = i;
          if (!inq[e.to]) {
            q.push(e.to);
            inq[e.to] = 1;
          }
        }
      }
    }
    if (dist[t] >= 1e9) {
      return {total, res};
    }
    int d = 1e9;
    for (int v = t; v != s; v = prevv[v]) {
      d = min(d, G[prevv[v]][preve[v]].cap);
    }
    res += d * dist[t];
    total += d;
    for (int v = t; v != s; v = prevv[v]) {
      edge &e = G[prevv[v]][preve[v]];
      e.cap -= d;
      G[v][e.rev].cap += d;
    }
  }
  return {total, res};
}
int pp[10002];
int ss[10002];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> p >> s;
  int source = 0;
  int sink = n + 3;
  int pro = n + 1;
  int spo = n + 2;
  for (int i = 1; i <= n; i++) addEdge(source, i, 1, 0);
  addEdge(pro, sink, p, 0);
  addEdge(spo, sink, s, 0);
  for (int i = 1; i <= n; i++) {
    int num;
    cin >> num;
    addEdge(i, pro, 1, -num);
  }
  for (int i = 1; i <= n; i++) {
    int num;
    cin >> num;
    addEdge(i, spo, 1, -num);
  }
  auto it = min_cost_flow(source, sink);
  vector<int> sports;
  vector<int> programming;
  for (int i = 0; i < G[pro].size(); i++) {
    edge &e = G[pro][i];
    if (e.to == sink) continue;
    if (e.cap > 0) programming.push_back(e.to);
  }
  for (int i = 0; i < G[spo].size(); i++) {
    edge &e = G[spo][i];
    if (e.to == sink) continue;
    if (e.cap > 0) sports.push_back(e.to);
  }
  cout << -it.second << "\n";
  for (int i = 0; i < programming.size(); i++) {
    cout << programming[i] << ' ';
  }
  cout << endl;
  for (int i = 0; i < sports.size(); i++) {
    cout << sports[i] << ' ';
  }
  return 0;
}
