#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1073741824")
#pragma warning(disable : 4996)
using namespace std;
const int N = 1e5 + 100;
pair<int, int> ar[N];
int col[N], us[5];
int ct(int m) {
  int c = 0;
  while (m) {
    c += m & 1;
    m >>= 1;
  }
  return c;
}
int main() {
  int n, h;
  scanf("%d%d", &n, &h);
  for (int i = 0; i < n; i++) {
    scanf("%d", &ar[i].first);
    ar[i].second = i;
  }
  if (n < 8) {
    int ans = 2e9, t;
    for (int mk = 0; mk < (1 << n); mk++) {
      int mx = -1, mn = 2e9;
      for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
          int d = ar[i].first + ar[j].first;
          if (((mk >> i) & 1) != ((mk >> j) & 1)) d += h;
          mx = max(mx, d);
          mn = min(mn, d);
        }
      }
      if (ans > mx - mn) {
        ans = mx - mn;
        t = mk;
      }
    }
    printf("%d\n", ans);
    for (int i = 0; i < n; i++) printf("%d ", ((t >> i) & 1) + 1);
    return 0;
  }
  sort(ar, ar + n);
  int ans = ar[n - 1].first + ar[n - 2].first - ar[0].first - ar[1].first,
      s = -1, f;
  for (int g = 0; g < (1 << 4); g++) {
    int mn = 2e9, mx = -1, c = ct(g);
    if (c != 2) continue;
    for (int a = 0; a < 4; a++) {
      for (int b = a + 1; b < 4; b++) {
        int d = ar[a].first + ar[b].first;
        if (((g >> a) & 1) != ((g >> b) & 1)) d += h;
        mx = max(mx, d);
        mn = min(mn, d);
      }
    }
    for (int k = g == 0; k < (1 << 4); k++) {
      c = ct(k);
      if (c != 2) continue;
      int cmx = mx, cmn = mn;
      for (int a = 0; a < 4; a++) {
        for (int b = a + 1; b < 4; b++) {
          int d = ar[n - 4 + a].first + ar[n - 4 + b].first;
          if (((k >> a) & 1) != ((k >> b) & 1)) d += h;
          cmn = min(cmn, d);
          cmx = max(cmx, d);
        }
      }
      if (ans > cmx - cmn) {
        ans = cmx - cmn;
        f = g;
        s = k;
      }
    }
  }
  int cans = 2e9, ind = -1;
  for (int i = 0; i < n; i++) {
    int j = 0, d = 0, mx = -1, mn = 2e9;
    while (j == i) j++;
    mn = min(mn, ar[i].first + ar[j].first + h);
    d += ar[j].first;
    j++;
    while (j == i) j++;
    d += ar[j].first;
    mn = min(d, mn);
    d = 0;
    j = n - 1;
    while (j == i) j--;
    mx = max(mx, ar[i].first + ar[j].first + h);
    d += ar[j].first;
    j--;
    while (j == i) j--;
    d += ar[j].first;
    mx = max(d, mx);
    if (cans > mx - mn) {
      cans = mx - mn;
      ind = i;
    }
  }
  if (cans < ans) {
    printf("%d\n", cans);
    ind = ar[ind].second;
    for (int i = 0; i < n; i++) {
      printf("%d ", i == ind ? 2 : 1);
    }
    return 0;
  }
  if (s != -1) {
    for (int i = 0; i < 4; i++) {
      col[ar[i].second] = (f >> i) & 1;
      us[ar[i].second] = 1;
    }
    for (int i = 0; i < 4; i++) {
      col[ar[n - 4 + i].second] = (s >> i) & 1;
      us[col[ar[n - 4 + i].second]] =
          us[col[ar[n - 4 + i].second]] == 1 ? 2 : 1;
    }
    if (us[0] == 2)
      for (int i = 5; i < n - 4; i++) col[ar[i].second] = 0;
    else
      for (int i = 5; i < n - 4; i++) col[ar[i].second] = 1;
  }
  printf("%d\n", ans);
  for (int i = 0; i < n; i++) printf("%d ", col[i] + 1);
  return 0;
}
