#include <bits/stdc++.h>
using namespace std;
const int nmax = 1000023;
int v1[nmax], d;
int st = 1, dr, n, m;
struct str {
  int val;
  int pos;
} v2[nmax];
int comp(const str &a, const str &b) { return a.val < b.val; }
int comp2(const str &a, const str &b) { return a.pos < b.pos; }
int nextone(int &i, int &j) {
  if (j == m + 1) {
    ++i;
    return v1[i - 1];
  }
  if (i == n + 1) {
    ++j;
    return v2[j - 1].val;
  }
  if (v1[i] < v2[j].val) {
    ++i;
    return v1[i - 1];
  }
  ++j;
  return v2[j - 1].val;
}
int check(int i2) {
  int i1 = 1;
  for (int day = 0;; ++day) {
    for (int i = 1; i <= d; i++) {
      int x = nextone(i1, i2);
      if (x < day) return 0;
      if (i1 == n + 1 && i2 == m + 1) return 1;
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &d);
  for (int i = 1; i <= n; i++) scanf("%d", &v1[i]);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &v2[i].val);
    v2[i].pos = i;
  }
  sort(v1 + 1, v1 + n + 1), sort(v2 + 1, v2 + m + 1, comp);
  dr = m;
  if (!check(m + 1)) {
    printf("-1\n");
    return 0;
  }
  int rasp = 0;
  while (st <= dr) {
    int mij = (st + dr) / 2;
    if (check(mij)) {
      rasp = m - mij + 1;
      dr = mij - 1;
    } else
      st = mij + 1;
  }
  printf("%d\n", rasp);
  for (int i = m - rasp + 1; i <= m; i++) printf("%d ", v2[i].pos);
}
