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

  UØdavinio  sprendimo  idÓja  paremta tokiais pastebÓjimais:
                      1 jeigu duotasis daugianaris  turi tam tikrjÖ
       kintamujÖ  kvadratÖ,tai atinkantys klasÓs B daugianariai turi
       koeficientus 1 prie tÖ  kintamujÖ;
                      2 jeigu  iÕkelti uØ skliaustÖ duotojo  daugianario
       visÖ  koeficientÖ didØiausiÐ  bendrÐjÔ  daliklÔ, tai  jo (daliklio)
       dalikliÖ kiekis duoda daugianario skaidymo ( jei Ôimanoma iÕskaidyti)
       b×dÖ kiekÔ;
                      3 jeigu  kintamasis neturi duotojo daigianario iÕraiÕkoje
       kvadratÖ, tai  jo  koeficientas klasÓs B daugianaryje yra lygus ( po
       daugianario padalinimo iÕ didØiausio visÖ  koeficientÖ daliklio ) tÖ
       vienanariÖ, kuriÖ reiÕkinyje jis ÔraÕytas, koeficientÖ didØiausiam
       bendrajam dalikliui.
  Algoritmas,kuris naudoja Õiuos pastebÓjimus, gali sugeneruoti neteisingus
  skaidymo ôdaugikliusõ tuo atvÓjuÑkai  pradinis  daugianaris negali b×ti
  suskadytas  dauginamaisiais, todÓl reikalingas patikrinimas, ar gautÖ
  B klasÓs daugianariÖ sandauga lygi  pradiniam daugianariui.

}
  program daugianariai;

   const  prad='daugin.dat';
          rez ='daugin.rez';
          maxN=676;


    var dA  : array['a'..'z','a'..'z'] of word;
        adB,bdB : array['a'..'z'] of integer;
        visi,kvadratai   : set of 'a'..'z';
        N       : word;
        daugiklis:word;        { VisÖ  koeficientÖ didØiasias bendras daliklis  }


 procedure nuskaityti;         { Nuskaitome ir paruoÕiame duomenis   }

      var f:text;
          I,j,kof:integer;
          c1,c2,ch:char;
          inkof:boolean;
          S:string;

    begin
      assign(f,prad);
      reset(f);
      visi:=[];
      kvadratai:=[];
      for c1:='a' to 'z' do
       for c2:='a' to 'z' do
       dA[c1,c2]:=0;

      for c1:='a' to 'z' do
       begin
        adB[c1]:=0;
        bdB[c1]:=0;
       end;
      readln(f,N);

      for I:=1 to N do
      begin
      inkof:=true;
      kof:=0;
      readln(f,S);
      for j:=1 to length(S) do
         begin
           ch:=S[j];
           case ch  of
           '0'..'9': if inkof then kof:=kof*10+ord(ch)-ord('0')
                              else c2:=c1;
           'a'..'z': begin visi:=visi+[ch];
                           if inkof then
                                begin
                                  c1:=ch;
                                  inkof:=false;
                                 end
                              else  c2:=ch;
                    end;
           end;
         end;
       if kof<>0 then dA[c1,c2]:=kof
                  else dA[c1,c2]:=1;
       dA[c2,c1]:=dA[c1,c2];
     end;
      close(f);
    end;


function dbd(x,y:word):word;          { Randa × ir y didØiausÔ bedrÐjÔ daliklÔ }
var d,l,r:word;
begin
 d:=x;l:=y;
 if x<y then
        begin d:=y;l:=x;end;
 if (l=0) then
       if (d=0) then begin dbd:=0;exit;end
                else begin dbd:=d;exit;end;
  r:=d mod l;
  while  r>0 do
   begin
    d:=l;
    l:=r;
    r:=d mod l;
   end;
   dbd:=l;
end;

function KiekDalikliu(a:integer):integer;
        {  SkaiÑiuja  duotojo  skaiÑiaus dalikliÖ kiekÔ }

  var I,k: integer;

begin
   k:=0;
   for I:=1 to a do
    if  a mod I = 0 then inc(k);
   KiekDalikliu:=k;
end;


function spresti:word;           { SprendØia uØdavinÔ,grÐØina sprendiniÖ kiekÔ}

 function tikrinti:boolean;  { Tikrina, ar gautÖ B kl. daugainariÖ sandauga
                               lygi pradiniam daugianariui }

     var c1,c2:char;
 begin
   tikrinti:=false;
   for c1:='a' to 'z' do
    for c2:='a' to 'z' do
     if c1=c2 then
                if adB[c1]*bdB[c2]<>dA[c1,c2]
                 then exit
                 else continue
              else if adB[c1]*bdB[c2]+adB[c2]*bdB[c1]<>dA[c1,c2]
                then exit;
   tikrinti:=true;
 end;

var ch,c1,c2:char;
    i:integer;
    suradome:boolean;
    ax,ay,bx,by:integer;
    pirmo,antro:set of 'a'..'z';


begin
 spresti:=0;
 daugiklis:=0;
 for c1:= 'a' to 'z' do
  for c2:= 'a' to 'z' do
   daugiklis:=dbd(daugiklis,dA[c1,c2]);

 for c1:= 'a' to 'z' do
  for c2:= 'a' to 'z' do
   dA[c1,c2]:=dA[c1,c2] div daugiklis;

 suradome:=false;
 for c1:='a' to 'z' do
  if dA[c1,c1]=1 then begin kvadratai:=kvadratai+[c1];adB[c1]:=1;bdB[c1]:=1;end
                 else if (c1 in visi) and not(suradome)
                        then begin ch:=c1;suradome:=true;end;

 antro:=kvadratai;
 for c2:='a' to 'z' do
  if dA[ch,c2]>0 then antro:=antro+[c2];

 pirmo:=visi-antro+kvadratai;

 for c1:='a'to'z' do
  if ( c1 in pirmo )
              then
                begin
                adB[c1]:=0;
                for c2:='a'to 'z' do
                 adB[c1]:=dbd(adb[c1],dA[c1,c2])
                end
              else
                begin
                bdB[c1]:=0;
                for c2:='a'to 'z' do
                 bdB[c1]:=dbd(bdb[c1],dA[c1,c2])
                end;
 if tikrinti then spresti:=KiekDalikliu(daugiklis);
 end;


var i,rezultatas:integer;
    ch:char;
    f:text;
    S1,S2,ts:string;

begin        {  Skaidymas   }
  nuskaityti;
  rezultatas:=spresti;
  assign(f,rez);
  rewrite(f);
  writeln(f,rezultatas);
  if rezultatas>0 then
  begin
   S1:='';
   S2:='';
   for  ch:='a' to 'z' do
   begin
    if adB[ch]>0 then
                  begin
                   adB[ch]:=daugiklis*adB[ch];
                   if adB[ch]<>1 then Str(adB[ch],ts)
                                 else ts:='';
                   S1:=S1+'+'+ts+ch;
                  end;
    if bdB[ch]>0 then
                  begin
                   if bdB[ch]<>1 then Str(bdB[ch],ts)
                                 else ts:='';
                   S2:=S2+'+'+ts+ch;
                  end;
   end;
   S1[1]:=' ';
   S2[1]:=' ';
   writeln(f,S1);
   writeln(f,S2);
  end;
  close(f);
end.                  { ... Skaidymas   }