{ Petr Hruska }
{$R+}
Const SOUBOR_MRIZKY = 'mrizka.txt';
      MaxN = 16;

Type TMrizka = Array [1 .. MaxN, 1 .. MaxN] Of Boolean;
     TMrizky = Array [1 .. 4] Of TMrizka;
     TBlok = Array [1 .. MaxN] Of String[MaxN];
     TVelikost = 1 .. MaxN;

Var M : TMrizka;
    M4 : TMrizky; { pole s pootocenymi mrizkami }
    I : Integer;
    B : TBlok;
    N : TVelikost; { velikost mrizky }
    Vstup, Vystup : Text;

{ nacte mrizku ze souboru }
Procedure NactiMrizku(Var N : TVelikost; Var M : TMrizka);
Var I, J, B : Integer;
    F : Text;
Begin
  { otevreni souboru pro cteni }
  Assign(F, SOUBOR_MRIZKY);
  Reset(F);

  { nacteni dat }
  Readln(F, N);
  For J := 1 To N Do
    Begin
      For I := 1 To N Do
        Begin
          Read(F, B);
          M[I, J] := B > 0;
        End;
    end;

  { uzavreni souboru }
  Close(F);
End;


Procedure Rotace(N : Integer; Var M : TMrizka);
Var P : TMrizka; { pomocna mrizka }
    I, J : Integer;
Begin
  For J := 1 To N Do
    For I := 1 To N Do
      P[N+1-J, I] := M[I, J];
  For J := 1 To N Do
    For I := 1 To N Do
      M[I, J] := P[I, J];
End;


Procedure TiskniMrizku(N : TVelikost; Var M : TMrizka);
Var I, J : Integer;
Begin
  Writeln(N);
  For J := 1 To N Do
    Begin
      For I := 1 To N Do Write(Ord(M[I, J]), ' ');
      Writeln;
    End;
End;


Procedure OtevriSoubory(Var Vstup, Vystup : Text);
Begin
  Assign(Vstup, 'vstup.txt');
  Reset(Vstup);

  Assign(Vystup, 'vystup.txt');
  Rewrite(Vystup);
End;


Procedure NactiBlok(N : TVelikost; Var B : TBlok; Var Vstup : Text);
Var I : Integer;
Begin
  For I := 1 To N Do Readln(Vstup, B[I]);
{  For I := 1 To N Do Writeln(B[I]);}
End;


Procedure ZavriSoubory(Var Vstup, Vystup : Text);
Begin
  Close(Vstup);
  Close(Vystup);
End;


Procedure Prilozeni(N : TVelikost; Var M : TMrizka; Var B : TBlok; Var Vystup : Text);
Var I, J : Integer;
    S : String;
Begin
  S := '';
  For J := 1 To N Do
    For I := 1 To N Do
      If M[I, J] Then S := S + B[J][I];
  Writeln(Vystup, S);
End;


{ Desifruje a zapise do souboru desifrovany text }
Procedure DesifrujBlok(N : TVelikost; Var M4 : TMrizky; Var B : TBlok; Var Vystup : Text);
Var I : Integer;
Begin
  For I := 1 To 4 Do Prilozeni(N, M4[I], B, Vystup);
End;


Begin
  NactiMrizku(N, M);
  For I := 1 To 4 Do
    Begin
      M4[I] := M;
      Rotace(N, M);
    End;
  OtevriSoubory(Vstup, Vystup);

  While Not Eof(Vstup) Do
    Begin
      NactiBlok(N, B, Vstup);
      DesifrujBlok(N, M4, B, Vystup);
    End;

  ZavriSoubory(Vstup, Vystup);
End.