#include <bits/stdc++.h>
#pragma GCC target("sse,sse2,sse3,sse4")
using namespace std;
const int MAX_N = 3e5 + 1;
const long long INF = 1e18;
int solve();
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
long long gcdExt(long long a, long long b, long long& x, long long& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x0;
  long long y0;
  long long g = gcdExt(b % a, a, x0, y0);
  x = y0 - (b / a) * x0;
  y = x0;
  return g;
}
long long myCeil(long long x, long long y) {
  if (x % y == 0) {
    return x / y;
  }
  if ((x > 0 && y > 0) || (x < 0 && y < 0)) {
    return abs(x) / abs(y) + 1;
  }
  if (x < 0 || y < 0) {
    return x / y;
  }
}
long long myFloor(long long x, long long y) {
  if (x % y == 0) {
    return x / y;
  }
  if ((x > 0 && y > 0) || (x < 0 && y < 0)) {
    return abs(x) / abs(y);
  }
  if (x < 0 || y < 0) {
    return x / y - 1;
  }
}
long long n;
long long s;
long long c3 = 0;
long long c4 = 0;
long long c5 = 0;
long long ans = INF;
long long ansK3 = -1;
long long ansK4 = -1;
long long ansK5 = -1;
void update(long long a3, long long a4, long long a5) {
  long long newAns = abs(c3 * a3 - c4 * a4) + abs(c4 * a4 - c5 * a5);
  if (newAns < ans) {
    ans = newAns;
    ansK3 = a3;
    ansK4 = a4;
    ansK5 = a5;
  }
}
int solve() {
  cin >> n >> s;
  for (int i = 1; i <= n; ++i) {
    int x;
    cin >> x;
    if (x == 3) {
      c3++;
    }
    if (x == 4) {
      c4++;
    }
    if (x == 5) {
      c5++;
    }
  }
  for (long long k4 = 0; k4 < MAX_N; ++k4) {
    long long A = k4 * c4;
    if (s - A < 0) {
      break;
    }
    long long C = s - A;
    long long k3;
    long long k5;
    long long g = gcdExt(c3, c5, k3, k5);
    if (C % g != 0) {
      continue;
    }
    k3 *= C / g;
    k5 *= C / g;
    long long d1 = c5 / g;
    long long d2 = c3 / g;
    long long L;
    long long R;
    long long Lp;
    long long Rp;
    L = myCeil(A, c3);
    R = myFloor(A, c5);
    Lp = max(myCeil(L - k3, d1), myCeil(k5 - R, d2));
    Rp = min(myFloor(k5, d2), min(myFloor(k4 - k3, d1), myFloor(k5 - k4, d2)));
    if (Lp <= Rp) {
      update(k3 + Lp * d1, k4, k5 - Lp * d2);
    }
    L = myFloor(A, c3);
    R = myCeil(A, c5);
    Lp = myCeil(-k3, d1);
    Rp = min(myFloor(L - k3, d1), myFloor(k5 - R, d2));
    Rp = min(Rp, min(myFloor(k4 - k3, d1), myFloor(k5 - k4, d2)));
    if (Lp <= Rp) {
      update(k3 + Rp * d1, k4, k5 - Rp * d2);
    }
    L = myCeil(A, c3);
    R = myCeil(A, c5);
    Lp = myCeil(L - k3, d1);
    Rp = min(myFloor(k5 - R, d2),
             min(myFloor(k4 - k3, d1), myFloor(k5 - k4, d2)));
    if (Lp <= Rp) {
      if (c3 * d1 - c5 * d2 >= 0) {
        update(k3 + Lp * d1, k4, k5 - Lp * d2);
      } else {
        update(k3 + Rp * d1, k4, k5 - Rp * d2);
      }
    }
    L = myFloor(A, c3);
    R = myFloor(A, c5);
    Lp = max(myCeil(-k3, d1), myCeil(k5 - R, d2));
    Rp = min(myFloor(L - k3, d1), myFloor(k5, d2));
    Rp = min(Rp, min(myFloor(k4 - k3, d1), myFloor(k5 - k4, d2)));
    if (Lp <= Rp) {
      if (c3 * d1 - c5 * d2 <= 0) {
        update(k3 + Lp * d1, k4, k5 - Lp * d2);
      } else {
        update(k3 + Rp * d1, k4, k5 - Rp * d2);
      }
    }
  }
  if (ansK3 == -1) {
    cout << -1 << endl;
    return 0;
  }
  cout << ansK3 << ' ' << ansK4 << ' ' << ansK5 << endl;
  return 0;
}
