{ UØdavinio autorius: Irus Grinis, "µØuolyno" v.m. informatikos mokytojas.
  SprendimÐ bei testus parengÓ Irus Grinis.

 Sprendimo  idÓja  labai  paprasta: tiesiog panaudojame skaiÑiavimÖ
 su  grÔØimais schemÐ: mieginame parinkti eilnÔ stulpelÔ-jeigu
 ôiÕeinaõ parinkti - Ok, kitaip grÔØtame prie ankstenio stulpelio.
 Realizacijos ypatumas yra  tas,kad paieÕka   pagreitÓja, jeigu
 prieÕ tai sur×Õiuoti eilutes pagal jÖ sumas maØÓjanÑia tvarka.

}



const   maxN=20;
        BituSuma:array[0..15] of byte=(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);
        Laipsniai:array[1..4] of byte=(1,2,4,8);


var  Lentele:array[1..5,1..maxN+1] of byte;
     N:integer;
     Deklas:array[0..maxN] of integer;
     RodDeklo:byte;
     Keit:array[1..4] of integer;

function GalimaAtimti(a:integer):boolean;
   var Gal:array[1..4] of integer;
       i:byte;
   begin
      GalimaAtimti:=false;
      for i:=1 to 4 do
       begin
       Gal[i]:=Lentele[i,maxN+1] - (a and Laipsniai[i]) shr (i-1);
       if Gal[i]<0 then exit;
       end;
      GalimaAtimti:=true;
      for i:=1 to 4 do
       begin
       Lentele[i,maxN+1]:=Gal[i];
       end;
   end;



function Priekin:boolean; { Mieginame uØpildyti eilinÔ stulpelÔ }


  var i:integer;

  begin
     Priekin:=false;
     for i:=Deklas[RodDeklo]+1 to 15 do
      if (BituSuma[i]=Lentele[5,RodDeklo]) then if  GalimaAtimti(i)
        then begin
        Priekin:=true;
        Deklas[RodDeklo]:=i;
        Inc(RodDeklo);
        exit;
        end;


  end;

function Atgal:boolean;     { GrÔØtame atgal prie ankstesniÖ stulpeliÖ.
                               }
  procedure Grazinti(a:word);
      var i:byte;
   begin
      for i:=1 to 4 do
       Lentele[i,maxN+1]:=Lentele[i,maxN+1] +
                (a and Laipsniai[i]) div Laipsniai[i];
   end;

   var found:boolean;
       i:integer;

  begin
    Atgal:=false;
    found:=false;
    while not found do
    begin
    Deklas[RodDeklo]:=-1;
    Dec(RodDeklo);
    If RodDeklo=0 then exit;
    Grazinti(Deklas[RodDeklo]);
    for i:=Deklas[RodDeklo]+1 to 15 do
      if (BituSuma[i]=Lentele[5,RodDeklo])
         and GalimaAtimti(i)
          then begin found:=true;Deklas[RodDeklo]:=i;Inc(RodDeklo);break;end;
    end;

    Atgal:=true;

  end;


function spresk:boolean;       { Funkcija, kuri sprendØia uØdavinÔ }

  function GaliojaSumuTvermesDesnis:boolean;
                             { ôEiluÑiÖ sumaõ=ôStulpeliÖ sumaõ}
   var i,s1,s2:integer;
   begin
      s1:=0;
      s2:=0;
      for i:=1 to N do s1:=s1+Lentele[5,i];
      for i:=1 to 4 do s2:=s2+Lentele[i,maxN+1];
      GaliojaSumuTvermesDesnis:=(s1=s2);
   end;

  procedure RusiuojameEilutes;  { ôR×Õiavimas  daØnai pagreitina skaiÑiavimusõ }

   var i,j,k,c:integer;

   begin
      for i:=1 to 4 do
         Keit[i]:=i;

      for I:=3 downto 1 do
       for J:=1 to I do
        if Lentele[J,maxN+1]<Lentele[J+1,maxN+1]
         then begin
          c:=Keit[j];
          Keit[j]:=Keit[j+1];
          Keit[j+1]:=c;
          for k:=1 to maxN+1 do
           begin
              c:=Lentele[J,k];
              Lentele[J,k]:=Lentele[j+1,k];
              Lentele[j+1,k]:=c;
           end;
         end;
   end;


  function Tikriname:boolean;   { ôO gal  atsakymas neteisingas...õ }
  var I:integer;
  begin
   Tikriname:=false;
   for i:=1 to 4 do
      if Lentele[i,maxN+1]<>0 then exit;
   Tikriname:=true;
  end;

  var I,J:integer;

  begin
   spresk:=false;

   if not GaliojaSumuTvermesDesnis then exit;

   RusiuojameEilutes;


   for i:=0 to N do
    Deklas[i]:=-1;


  RodDeklo:=1;
  while (RodDeklo > 0) and (RodDeklo<=N) do
   begin
     if not Priekin
                    then Atgal;

   end;

   if RodDeklo=(N+1) then spresk:=Tikriname;


  end;


   var f,g:text;
       i,j,k,l:integer;

begin
  assign(f,'lentele.dat');
  reset(f);
  readln(f,N);

  for i:=1 to  4 do
   for j:=1 to maxN+1  do
    lentele[i,j]:=0;

  for i:=1 to N   do { Stulpeliai }
    read(f,lentele[5,i]);

  for i:=1 to 4 do
    read(f,lentele[i,maxN+1]);

  writeln;
  assign(g,'lenteles.rez');
  rewrite(g);

  if not (spresk)
  then writeln(g,'NE')
  else
  begin
  write(g,'TAIP');
   for i:=1 to  4 do
    begin
    writeln(g);

    k:=0;l:=1;
    while k=0 do begin if Keit[l]=i then k:=l;inc(l);end;

    for j:=1 to N  do
     write(g,Deklas[j] and Laipsniai[k] div Laipsniai[K],' ');

    end;
  end;

  close(g);
end.