#include <bits/stdc++.h>
int Max(int a, int b) { return a < b ? b : a; }
int Min(int a, int b) { return a < b ? a : b; }
struct myStruct {
  int v, t, g;
} con[100000], *tmp[6], *la[6], *lb[6];
bool cmpV(myStruct a, myStruct b) { return a.v < b.v; }
bool cmpT(myStruct a, myStruct b) { return a.t < b.t; }
int n, h, ans = 2000000000;
void dfs(int t, int al, int bl) {
  if (t == 0) {
    int myMax = 0, myMin = 2000000000;
    for (int i = 0; i < al; i++) {
      for (int j = 0; j < al; j++) {
        if (i == j) continue;
        myMax = Max(myMax, la[i]->v + la[j]->v);
        myMin = Min(myMin, la[i]->v + la[j]->v);
      }
    }
    for (int i = 0; i < bl; i++) {
      for (int j = 0; j < bl; j++) {
        if (i == j) continue;
        myMax = Max(myMax, lb[i]->v + lb[j]->v);
        myMin = Min(myMin, lb[i]->v + lb[j]->v);
      }
    }
    for (int i = 0; i < al; i++) {
      for (int j = 0; j < bl; j++) {
        myMax = Max(myMax, la[i]->v + lb[j]->v + h);
        myMin = Min(myMin, la[i]->v + lb[j]->v + h);
      }
    }
    if (myMax - myMin < ans) {
      ans = myMax - myMin;
      for (int i = 0; i < al; i++) {
        la[i]->g = 1;
      }
      for (int i = 0; i < bl; i++) {
        lb[i]->g = 2;
      }
    }
    return;
  }
  la[al] = tmp[t - 1];
  dfs(t - 1, al + 1, bl);
  lb[bl] = tmp[t - 1];
  dfs(t - 1, al, bl + 1);
}
int main() {
  scanf("%d%d", &n, &h);
  for (int i = 0; i < n; i++) {
    scanf("%d", &con[i].v);
    con[i].t = i;
  }
  std::sort(con, con + n, cmpV);
  for (int i = 3; i < n - 3; i++) con[i].g = 1;
  if (n < 6) {
    for (int i = 0; i < n; i++) tmp[i] = &con[i];
    dfs(n, 0, 0);
  } else {
    for (int i = 0; i < 3; i++) tmp[i] = &con[i];
    for (int i = n - 3; i < n; i++) tmp[i - n + 6] = &con[i];
    dfs(6, 0, 0);
  }
  std::sort(con, con + n, cmpT);
  printf("%d\n", ans);
  for (int i = 0; i < n; i++) {
    if (i != 0) printf(" ");
    printf("%d", con[i].g);
  }
  puts("");
}
