#include <bits/stdc++.h>   using namespace std;   int x, y, q;   void exgcd(int a, int b) {     int temp;     if (b == 0) {       x = 1;       y = 0;       q = a;     } else {       exgcd(b, a % b);       temp = x;       x = y;       y = temp - a / b * y;     }   }   int c3, c4, c5;   int k3, k4, k5;   int f, x0, Why_Cant_I_Use_y0_In_Eclipse;   int up, down;   void init() {     up = 0xfffffff;     down = -0xfffffff;     down = max(down, (-x * f) / x0);     if (x * f + x0 * down < 0) down++;     up = min(up, (k4 - x * f) / x0);     if (x * f + x0 * up > k4) up--;     up = min(up, (y * f - k4) / Why_Cant_I_Use_y0_In_Eclipse);     if (y * f - Why_Cant_I_Use_y0_In_Eclipse * up < k4) up--;   }   int o3, o4, o5;   int ans;   void get_o(int t) {     o3 = x * f + x0 * t;     o4 = k4;     o5 = y * f - Why_Cant_I_Use_y0_In_Eclipse * t;   }   void solve(int s) {     exgcd(c3, c5);     if (s % q != 0) return;     f = s / q;     x0 = c5 / q;     Why_Cant_I_Use_y0_In_Eclipse = c3 / q;     {       init();       down = max(down, (c4 * k4 - c3 * x * f) / (c3 * x0));       if (c3 * x * f + c3 * x0 * down < c4 * k4) down++;       up = min(up, (c5 * y * f - c4 * k4) / (c5 * Why_Cant_I_Use_y0_In_Eclipse));       if (c5 * y * f - c4 * k4 < c5 * Why_Cant_I_Use_y0_In_Eclipse * up) up--;       if (down <= up) {         int judge = s - 2 * c4 * k4;         if (judge < ans) {           ans = judge;           get_o(down);         }       }     }     {       init();       up = min(up, (c4 * k4 - c3 * x * f) / (c3 * x0));       if (c4 * k4 - c3 * x * f < c3 * x0 * up) up--;       down =           max(down, (c5 * y * f - c4 * k4) / (c5 * Why_Cant_I_Use_y0_In_Eclipse));       if (c5 * y * f - c5 * Why_Cant_I_Use_y0_In_Eclipse * down > c4 * k4) down++;       if (down <= up) {         int judge = 2 * c4 * k4 - s;         if (judge < ans) {           ans = judge;           get_o(up);         }       }     }     {       init();       down = max(down, (c4 * k4 - c3 * x * f) / (c3 * x0));       if (c3 * x * f + c3 * x0 * down < c4 * k4) down++;       down =           max(down, (c5 * y * f - c4 * k4) / (c5 * Why_Cant_I_Use_y0_In_Eclipse));       if (c5 * y * f - c5 * Why_Cant_I_Use_y0_In_Eclipse * down > c4 * k4) down++;       if (down <= up) {         int judge = c3 * (x * f + x0 * down) -                     c5 * (y * f - Why_Cant_I_Use_y0_In_Eclipse * down);         if (judge < ans) {           ans = judge;           get_o(down);         }       }     }     {       init();       up = min(up, (c4 * k4 - c3 * x * f) / (c3 * x0));       if (c4 * k4 - c3 * x * f < c3 * x0 * up) up--;       up = min(up, (c5 * y * f - c4 * k4) / (c5 * Why_Cant_I_Use_y0_In_Eclipse));       if (c5 * y * f - c4 * k4 < c5 * Why_Cant_I_Use_y0_In_Eclipse * up) up--;       if (down <= up) {         int judge = -c3 * (x * f + x0 * up) +                     c5 * (y * f - Why_Cant_I_Use_y0_In_Eclipse * up);         if (judge < ans) {           ans = judge;           get_o(up);         }       }     }   }   int main() {     int n, s;     scanf( %d %d , &n, &s);     c3 = c4 = c5 = 0;     while (n--) {       int f;       scanf( %d , &f);       if (f == 3) c3++;       if (f == 4) c4++;       if (f == 5) c5++;     }     ans = 0xfffffff;     for (int i = 0; i <= s; i++) {       if (c4 * i > s) break;       k4 = i;       solve(s - c4 * k4);     }     if (ans == 0xfffffff)       printf( -1 n );     else {       printf( %d %d %d n , o3, o4, o5);     }     return 0;   }