var
arr:array of integer;
s:string;
si:string;
n,i,m,k,j:integer;
sk:string;

function poisk(i,j:integer):integer;
begin
  writeln('? ',i,' ',j);
  flush(output);
  readln(result);
  //writeln('poisk = ',result);
end;//poisk

procedure oo();
var j,m:integer;
begin
  k:=poisk(1,i);
  if k>si.Length then
  begin
    s:=s+(si.Length+1);
    si:=(si.Length+1)+si;
    arr[(si.Length)]:=s.Length;
  end else
  for j:=1 to si.Length do 
  begin
    //writeln('si.len ',si.Length);
    k:=poisk(arr[strtoint(si[j].ToString)],i);
    //1writeln('k ',k,' j ',j);
    if k=j then
    begin
      //writeln('k=j',k,' ',j);
      s:=s+si[j];
      arr[strtoint(si[j])]:=s.Length;
      si:=si[j]+si;
      delete(si,j+1,1);
      break;
    end;
  end;
end;//oo

begin
  readln(n);
  setLength(s,n);
  s:='1';
  i:=2;
  si:='1';
  writeln('? ',1,' ',n);
  flush(output);
  readln(m);
  setLength(arr,m+1);
  for j:=1 to m do
    arr[j]:=-1;
  arr[1]:=1;
  //writeln('s ',s);
  //writeln('i ',i);
  while(i<=n) do    
  begin
    //writeln('i ',i);
    oo();
    //writeln('s ',s,' si ',si,' i ',i);
    //for j:=1 to arr.Length-1 do
    //writeln('arr[',j,']',arr[j]);
    i:=i+1;    
  end;
  writeln('Ready!');
  flush(output);
  writeln(m);
  flush(output);
  sk:='';
  for i:=1 to s.Length do
  sk:=sk+s[i]+' ';
  writeln(sk);
  flush(output);
end.