#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int s = 0, t = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') t = -1;
    c = getchar();
  }
  while (isdigit(c)) s = s * 10 + c - 48, c = getchar();
  return s * t;
}
const int maxn = 2e5 + 5;
struct node {
  int v, t;
  bool operator<(const node& rhs) const { return v < rhs.v; }
} A[maxn];
int tot = 0, n, m;
int v[maxn], q[maxn];
inline int find(int val) {
  if (val > A[n].v && val < A[1].v) return 0;
  int l = 1, r = n, mid;
  while (l < r) {
    mid = (l + r) >> 1;
    if (A[mid].v >= val)
      r = mid;
    else
      l = mid + 1;
  }
  return A[l].v == val;
}
int main() {
  n = read(), m = read();
  for (register int i = 1; i <= n; i++) v[i] = A[A[i].t = i].v = read();
  sort(A + 1, A + n + 1);
  int add = 0, oven = 0;
  if (A[1].v & 1)
    add++;
  else
    oven++;
  for (register int i = 2; i <= n; i++) {
    if (A[i].v == A[i - 1].v)
      v[q[++tot] = A[i].t] = -1;
    else {
      if (A[i].v & 1)
        add++;
      else
        oven++;
    }
  }
  if (add > n / 2) {
    for (register int i = 1; i <= n; i++) {
      if (v[i] != -1 && (v[i] & 1)) v[q[++tot] = i] = -1, add--;
      if (add == n / 2) break;
    }
  } else if (oven > n / 2) {
    for (register int i = 1; i <= n; i++) {
      if (v[i] != -1 && !(v[i] & 1)) v[q[++tot] = i] = -1, oven--;
      if (oven == n / 2) break;
    }
  }
  int x = 1, ans = tot;
  while (tot && x <= m) {
    if ((x & 1) && add < n / 2) {
      if (!find(x)) v[q[tot--]] = x, add++;
    } else if (!(x & 1) && oven < n / 2) {
      if (!find(x)) v[q[tot--]] = x, oven++;
    }
    x++;
  }
  if (tot)
    puts("-1");
  else {
    printf("%d\n", ans);
    for (register int i = 1; i <= n - 1; i++) printf("%d ", v[i]);
    printf("%d\n", v[n]);
  }
  return 0;
}
