#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char c = getchar();
  long long x = 0;
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') {
    x = x * 10ll + c - '0';
    c = getchar();
  }
  return x;
}
struct node {
  long long pos, val;
} t[1000005];
long long a[10000005], mini[10000005];
bool cmp(node a, node b) { return a.val > b.val; }
long long n, m, k;
int main() {
  long long tp, i, j;
  n = read();
  m = read();
  k = read();
  for (i = 1; i <= n; i++) {
    tp = read();
    a[tp]++;
  }
  if (a[0] > k) {
    printf("-1\n");
    return 0;
  }
  for (i = 1; i <= 10000000; i++) {
    a[i] += a[i - 1];
    if (a[i] > k * (i + 1)) {
      printf("-1\n");
      return 0;
    }
  }
  mini[10000000] = k * 10000001ll - a[10000000];
  for (i = 9999999; i >= 0; i--) {
    mini[i] = min(mini[i + 1], k * (i + 1) - a[i]);
  }
  for (i = 1; i <= m; i++) {
    t[i].pos = i;
    t[i].val = read();
  }
  sort(t + 1, t + m + 1, cmp);
  long long rem = mini[10000000];
  for (i = 1; i <= m; i++) {
    rem = min(rem, mini[t[i].val]);
    if (a[t[i].val] + 1 > k * (t[i].val + 1) || rem == 0) {
      printf("%I64d\n", i - 1);
      for (j = 1; j <= i - 1; j++) {
        printf("%I64d ", t[j].pos);
      }
      return 0;
    }
    a[t[i].val]++;
    rem--;
  }
  printf("%I64d\n", m);
  for (j = 1; j <= m; j++) {
    printf("%I64d ", t[j].pos);
  }
  return 0;
}
