#include <stdio.h>
int D,N,Max_turn,Num_guess;
int Old_guess[30][9]={{1,0,2,3,4,5,6,7,8}};
int Old_results[30][2],Kume[10];  
long Max_time;

void initialization()
{
int i;
for(i=0;i<N;i++)
Kume[i]=1;
}

void Print_Out(void)
{
int i;
for(i=0;i<N;i++)
printf("%d",Old_guess[Num_guess][i]);
printf("\n"); 
}

int Number_Control(void)
{
int C_e,C_m;
int i,j,k;

for(i=Num_guess-1;i>=0;i--)
{
 C_e=C_m=0;
 for(j=0;j<N;j++)
   for(k=0;k<N;k++)
    if(Old_guess[i][j]==Old_guess[Num_guess][k])
    {
    ++(j==k?C_e:C_m);
    if(C_e>Old_results[i][0] || C_m>Old_results[i][1])
    return(0);
    break;
    }
if(Old_results[i][0]!=C_e || Old_results[i][1]!=C_m)
 return(0);
}
return(1);
}

int Oku(void)
{
scanf(" %d",&Old_results[Num_guess][0]);
if(Old_results[Num_guess][0]==N) exit(0);
else
scanf(" %d",&Old_results[Num_guess][1]);
return(Old_results[Num_guess][0]);
}

void Change_Next(void)
{
int i,j;

for(i=0;i<=D;i++)
Kume[i]=0;
Old_guess[Num_guess][0]=Old_guess[Num_guess-1][0]+1;
Kume[Old_guess[Num_guess][0]]=1;
for(i=1;i<N;i++)
 for(j=0;;j++)
 if(!Kume[j])
 {
  Old_guess[Num_guess][i]=j;
  Kume[j]=1;
  break;
 }
}

void Produce_Number(void)
{
int i,temp,yer=N;
for(;;)
{
	if(yer==N)
        {
        if(Number_Control())
         {
          Print_Out();
          if(!Oku())
          {
           Num_guess++;
           Change_Next();
           yer=N;
           goto mylabel;
          }
          else
          {
          temp=Num_guess;
          Num_guess++;
          for(i=0;i<N;i++)
          Old_guess[Num_guess][i]=Old_guess[temp][i];
          }
         }
         yer--;
        }

        for(i=Old_guess[Num_guess][yer]+1;i<=D;i++)
        if(!Kume[i])
	{
	Kume[Old_guess[Num_guess][yer]]=0;
	Kume[i]=1;
	Old_guess[Num_guess][yer]=i;
	yer++;
	goto mylabel;
	}
	Kume[Old_guess[Num_guess][yer]]=0;
	Old_guess[Num_guess][yer]=-1;
	yer--;
mylabel:
}
}

int main(void)
{
scanf(" %d %d %d %ld",&D,&N,&Max_turn,&Max_time);
initialization();
Produce_Number();
return(0);
}
