#include <bits/stdc++.h>
using namespace std;
template <class F, class T>
T convert(F a, int p = -1) {
  stringstream ss;
  if (p >= 0) ss << fixed << setprecision(p);
  ss << a;
  T r;
  ss >> r;
  return r;
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T cube(T x) {
  return x * x * x;
}
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return s == 0 ? 0 : cntbit(s >> 1) + (s & 1);
}
const double PI = acos(-1.0);
const double eps = 1e-12;
const int dr[] = {-1, -1, -1, 0, +1, +1, +1, 0};
const int dc[] = {-1, 0, +1, +1, +1, 0, -1, -1};
const int inf = (int)1e9 + 5;
const long long linf = (long long)1e16 + 5;
const long long mod = (long long)1e9 + 9;
int n, h, part[100005];
pair<int, int> a[100005];
int main() {
  scanf("%d %d", &n, &h);
  for (int i = (1); i <= (n); ++i) {
    scanf("%d", &a[i].first);
    a[i].second = i;
  }
  sort(a + 1, a + n + 1);
  int onepart = a[n].first + a[n - 1].first - (a[1].first + a[2].first);
  int res = onepart, bestpos = -1;
  for (int i = (2); i <= (n); ++i) {
    int fmin = a[1].first + a[2].first + h;
    if (i > 2) fmin = min(fmin, a[2].first + a[3].first);
    if (i < n) fmin = min(fmin, a[1].first + a[i + 1].first);
    int fmax = a[i].first + a[1].first + h;
    if (i < n) fmax = max(fmax, a[i].first + a[n].first + h);
    if (i < n - 1) fmax = max(fmax, a[n - 1].first + a[n].first);
    if (i > 2) fmax = max(fmax, a[i].first + a[i - 1].first);
    if (res > fmax - fmin) {
      res = fmax - fmin;
      bestpos = i;
    }
  }
  if (res == onepart)
    for (int i = (1); i <= (n); ++i) part[i] = 1;
  else
    for (int i = (1); i <= (n); ++i)
      part[a[i].second] = (2 <= i && i <= bestpos ? 1 : 2);
  printf("%d\n", res);
  for (int i = (1); i <= (n); ++i) printf("%d ", part[i]);
  return 0;
}
