#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
int n = 0, m = 0;
int even = 0, odd = 0;
int pointerOdd = 1, pointerEven = 2;
const int MAXA = 1e6 + 5;
bool used[MAXA];
vector<pair<int, int> > distinct;
pair<int, int> number[MAXN], initialNumbers[MAXN];
stack<int> st;
bool cmp1(pair<int, int> a, pair<int, int> b) { return a.first < b.first; }
bool cmp2(pair<int, int> a, pair<int, int> b) { return a.second < b.second; }
int prevNumber = -1;
void addToDistinct(int i) {
  distinct.push_back(number[i]);
  if (number[i].first <= m && number[i].first < MAXA)
    used[number[i].first] = true;
  prevNumber = number[i].first;
}
int main() {
  for (int i = 0; i < MAXA; i++) used[i] = false;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    if (a < MAXA) used[a] = true;
    if (a % 2)
      odd++;
    else
      even++;
    pair<int, int> p(a, i);
    number[i] = p;
    initialNumbers[i] = p;
  }
  sort(number, number + n, cmp1);
  for (int i = 0; i < n; i++) {
    int current = number[i].first;
    if (!i) {
      addToDistinct(i);
    } else if (current == prevNumber) {
      if (current % 2 && odd <= even || current % 2 == 0 && even > odd) {
        while (pointerOdd <= m && used[pointerOdd]) pointerOdd += 2;
        if (pointerOdd > m) {
          cout << -1 << endl;
          return 0;
        }
        if (pointerOdd < MAXA) used[pointerOdd] = true;
        distinct.push_back(make_pair(pointerOdd, number[i].second));
        if (current % 2 == 0) {
          even--;
          odd++;
        }
      } else {
        while (pointerEven <= m && used[pointerEven]) pointerEven += 2;
        if (pointerEven > m) {
          cout << -1 << endl;
          return 0;
        }
        if (pointerEven < MAXA) used[pointerEven] = true;
        distinct.push_back(make_pair(pointerEven, number[i].second));
        if (current % 2) {
          even++;
          odd--;
        }
      }
    } else {
      addToDistinct(i);
    }
  }
  if (odd != even) {
    for (int i = 0; i < n; i++) {
      if (distinct.at(i).first % 2 && even < odd) {
        while (pointerEven <= m && used[pointerEven]) pointerEven += 2;
        if (pointerEven > m) {
          cout << -1 << endl;
          return 0;
        }
        used[pointerEven] = true;
        distinct.at(i).first = pointerEven;
        odd--;
        even++;
        if (odd == even) break;
      } else if (distinct.at(i).first % 2 == 0 && odd < even) {
        while (pointerOdd <= m && used[pointerOdd]) pointerOdd += 2;
        if (pointerOdd > m) {
          cout << -1 << endl;
          return 0;
        }
        used[pointerOdd] = true;
        distinct.at(i).first = pointerOdd;
        odd++;
        even--;
        if (odd == even) break;
      }
    }
  }
  int ans = 0;
  sort(distinct.begin(), distinct.end(), cmp2);
  for (int i = 0; i < n; i++)
    if (distinct.at(i).first != initialNumbers[i].first) ans++;
  cout << ans << endl;
  for (int i = 0; i < distinct.size(); i++) cout << distinct.at(i).first << " ";
  return 0;
}
