/*
n,m,s,d
有n瓶新水放入s个柜子,每个柜子容量是d,每个柜子一开始有si瓶旧水
现在随机在柜子里取m瓶水,使每个人都拿到旧水的概率最大化的放新水策略
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,s,d;
struct Node{
int id,c;
}c[205];
int cmp(Node a,Node b){return a.c<b.c;}
int ans[205];
int main(){
cin>>n>>m>>s>>d;
for(int i=1;i<=s;i++){
cin>>c[i].c;
c[i].id=i;
}
sort(c+1,c+1+s,cmp);
int p=0;
while(n){
++p;
if(n>=(d-c[p].c)){
n-=d-c[p].c;
ans[c[p].id]=d-c[p].c;
}else {
ans[c[p].id]=n;
n=0;
break;
}
if(p==s)break;
}
if(n){
puts("impossible");
}
else {
int sum=0;
for(int i=p+1;i<=s;i++)
sum+=c[i].c;
if(sum<m)puts("impossible");
else {
for(int i=1;i<=s;i++)
cout<<ans[i]<<' ';
}
}
}