program grioveliai;
  { 82 uýdavinys }
   const max = 200; { didýiausia galima kvadrato kra÷tinó }
   type kvadratas = array [1..max, 1..max] of char;

   function saknis (x : integer) : integer;
     { traukia kvadratinñ ÷aknõ }
     var a, b, { intervalas }
         ab, xx : integer;
   begin
     a := 1; b := x + 1; { pradinis intervalas }
     while b - a > 1 do
       begin
         ab := (a + b) div 2; { intervalas dalijamas pusias }
         xx := x div ab;
         if xx >= ab
            then a := ab
            else b := ab
        end;
     saknis := a;
   end;

   procedure delioti (n, nn : integer; { plok÷teliù su vienu ir dviem }
                                       { grioveliais skaißius }
                      kr : integer; { kvadrato kra÷tinó }
                      var kv : kvadratas { sudóliotas kvadartas });
     { i÷dólioja plok÷teles, kai nn <= k }
     var i, j, piln, eil : integer;
   begin
     { dóliosime plok÷teles su dviem grioveliais }
     { sudóliosime pilnas eiles }
     piln := nn div kr;
     for i := 1 to piln do
       for j := 1 to kr do
         kv[i, j] := '+';
     nn := nn - (nn div kr) * kr;
     { sudóliosime likusias plok÷teles su dviem grioveliais }
     if piln = 0
        then eil := 1
        else eil := kr;
     for j := 1 to nn do
       kv[eil, j] := '+';
     { paýymósime tÝ langelõ, kurõ gali tekti palikti tu÷ßiÝ }
     if eil = kr
        then kv[kr, nn + 1] := 'T';
     { dóliosime plok÷teles su vienu grioveliu }
     i := 1;
     j := 1;  { pirmiausia ýemyn }
     while (n > 0) and (kv[1, j] = '+') do
       begin
         if kv[i, j] = '0'
            then begin
                   kv[i, j] := 'I';
                   n := n - 1;
                 end
            else if kv[i, j] = 'T'
                    then kv[i, j] := '0';
         i := i + 1;  { perskaißiuojame eilutes }
         if i = kr + 1
            then begin
                   i := 1;
                   j := j + 1;
                 end
            else if kv[1, j] <> '+'
                 then begin
                        i := 1;
                        j := j + 1;
                      end;
       end;
     { po to horizontaliai, tuo atveju, jei nn < k }
     if n > 0
        then for j := nn + 1 to nn + n do
               kv[1, j] := '-';
   end;

   procedure ploksteles (n, nn : integer; { plok÷teliù su vienu ir dviem }
                                         { grioveliais skaißius }
                         var kv : kvadratas; { sudóliotas kvadartas }
                         var kr : integer { kvadrato kra÷tinó });
     var nuo, tuscia, k, p, i, j : integer;
   begin
     { rasime minimalaus kvadrato, õ kurõ tilptù nn + n plok÷teliù, kra÷tinñ }
      k := saknis (n + nn);
      if k * k < n + nn
         then k := k + 1;
     { pasirinksime vienÝ i÷ dóliojimo variantù }
     if nn <= k  { rasime ie÷komo kvadrato kra÷tinñ }
        then begin
               p := k - nn + (k - 1) * nn;
               if nn = 0
                  then kr := n
                  else if (n - p) mod (nn + 1) = 0
                          then kr := k + (n - p) div (nn + 1)
                          else kr := k + (n - p) div (nn + 1) + 1;
             end
        else begin
               if k * k - 1 < nn + n
                  then kr := k + 1
                  else kr := k;
             end;
     { uýpildysime kvadratÝ tu÷ßiomis plok÷telómis }
     for i := 1 to kr do
       for j := 1 to kr do
         kv[i, j] := '0';
     delioti (n, nn, kr, kv)
   end;
{----------------------------------------------------------}
   var f : text;
       i, j, n, nn, krastine : integer;
       kv : kvadratas;
begin
  assign (f, 'griov.dat');
  reset (f);
  readln (f, n, nn);
  close (f);

  ploksteles (n, nn, kv, krastine);

  assign (f, 'griov.rez');
  rewrite (f);
  writeln (f, krastine);
  for i := 1 to krastine do
    begin
      for j := 1 to krastine do
        write(f, kv[i, j]);
      writeln (f);
    end;
  close (f);
end.
