#include <bits/stdc++.h>
using namespace std;
template <class T>
T __sqr(const T x) {
  return x * x;
}
template <class T, class X>
inline T __pow(T a, X y) {
  T z = 1;
  for (int i = 1; i <= y; i++) {
    z *= a;
  }
  return z;
}
template <class T>
inline T gcd(T a, T b) {
  a = abs(a);
  b = abs(b);
  if (!b) return a;
  return __gcd(b, a % b);
}
template <class T>
inline T lcm(T a, T b) {
  a = abs(a);
  b = abs(b);
  return (a / __gcd(a, b)) * b;
}
inline bool ispow2(int x) { return (x != 0 && (x & (x - 1)) == 0); }
template <class T>
void UpdateMin(T &x, T y) {
  if (y < x) {
    x = y;
  }
}
template <class T>
void UpdateMax(T &x, T y) {
  if (x < y) {
    x = y;
  }
}
template <class T, class X, class Y>
inline T bigmod(T n, X m, Y mod) {
  unsigned long long ret = 1, a = n % mod;
  while (m) {
    if (m & 1) ret = (ret * a) % mod;
    m >>= 1;
    a = (a * a) % mod;
  }
  ret %= mod;
  return (T)ret;
}
template <class T, class Y>
inline T modinv(T n, Y mod) {
  return bigmod(n, mod - 2, mod);
}
template <class T, class X>
int getbit(T s, X i) {
  return (s >> i) & 1;
}
template <class T, class X>
T onbit(T s, X i) {
  return s | (T(1) << i);
}
template <class T, class X>
T offbit(T s, X i) {
  return s & (~(T(1) << i));
}
template <class T>
inline void read(T &n) {
  char c;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  n = c - '0';
  for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0';
}
void extended_euclid(long long a, long long b, long long &x, long long &y) {
  if (!b) {
    x = 1, y = 0;
    return;
  }
  long long first, second;
  extended_euclid(b, a % b, first, second);
  x = second;
  y = first - (a / b) * second;
}
pair<long long, pair<long long, long long> > extendedEuclid(long long a,
                                                            long long b) {
  long long x = 1, y = 0;
  long long xLast = 0, yLast = 1;
  long long q, r, m, n;
  while (a != 0) {
    q = b / a;
    r = b % a;
    m = xLast - q * x;
    n = yLast - q * y;
    xLast = x, yLast = y;
    x = m, y = n;
    b = a, a = r;
  }
  return make_pair(b, make_pair(xLast, yLast));
}
const long long mod[] = {0,          1000000007, 1000000009,
                         1000000021, 1000000033, 1000000097,
                         1000000093, 1000000097, 1000000103};
const long long base[] = {0,       1000003, 1000033, 1000037, 1000039,
                          1000081, 1000099, 1000117, 1000121};
struct DT {
  long long v, id;
  bool operator<(const DT &b) const { return v < b.v; }
} a[(200000 + 20)];
bool comp(DT a, DT b) { return a.id < b.id; }
long long n, A, cf, cm, m, gt;
long long func(long long nd) {
  long long tk = m;
  for (int i = n - nd + 1; i <= n; i++) tk -= (A - a[i].v);
  long long mn = a[1].v;
  if (nd == n) mn = A;
  long long sv = A;
  swap(sv, a[n - nd + 1].v);
  for (int i = 2; i <= n - nd + 1; i++) {
    long long nw = (a[i].v - a[i - 1].v) * (i - 1);
    if (nw <= tk) {
      tk -= nw;
      mn = a[i].v;
    } else {
      mn += tk / (i - 1);
      break;
    }
  }
  swap(sv, a[n - nd + 1].v);
  long long ret = nd * cf + mn * cm;
  gt = mn;
  return ret;
}
int main() {
  scanf("%lld%lld%lld%lld%lld", &n, &A, &cf, &cm, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", a + i);
    a[i].id = i;
  }
  sort(a + 1, a + 1 + n);
  a[n + 1].v = A;
  long long cnt = 0, tk = m;
  for (int i = n; i >= 1; i--) {
    if (A - a[i].v <= tk) {
      tk -= (A - a[i].v);
      cnt++;
    } else
      break;
  }
  long long lo = 0, hi = cnt;
  while ((hi - lo) >= 10) {
    long long m1 = lo + (hi - lo) / 3;
    long long m2 = hi - (hi - lo) / 3;
    if (func(m1) < func(m2))
      lo = m1 + 1;
    else
      hi = m2 - 1;
  }
  long long ans = -1, id;
  for (int i = lo; i <= hi; i++) {
    long long f = func(i);
    if (f > ans) {
      ans = f;
      id = i;
    }
  }
  func(id);
  for (int i = 1; i <= n; i++) {
    if (i > (n - id)) {
      a[i].v = A;
    } else {
      a[i].v = max(gt, a[i].v);
    }
  }
  sort(a + 1, a + 1 + n, comp);
  printf("%lld\n", ans);
  for (int i = 1; i <= n; i++) {
    printf("%lld%c", a[i].v, i == n ? '\n' : ' ');
  }
  return 0;
}
