program staciakampis;
  { 101 u‘davinys }
  const MAX = 100; { maksimalus lapo kražtin‚s dydis }
        RSK = 26; { raid‘i— skai‡ius ab‚c‚l‚je }
  type lapas = array [1..MAX, 1..MAX] of char;

  { ‘emiau suražyti globalieji kintamieji }
  var s: lapas;      { duotasis lapas }
      m, n: integer; { jo ižmatavimai }

  function skirt: integer;
  { randa skirting— raid‘i— skai‡i— sta‡iakampyje s }
    var aibe: set of char;
        i, j, kiek: integer;
        c: char;
  begin
    { visas sta‡iakampio raides suražysime Ť aibŠ }
    aibe := [];
    for i := 1 to m do
      for j := 1 to n do
        aibe := aibe + [s[i, j]];
    { rasime skirting— raid‘i— skai‡iaus }
    kiek := 0;
    for c := 'A' to 'Z' do
      if c in aibe
         then kiek := kiek + 1;
    skirt := kiek
  end; { skirt }

  function daliklis (sk, x: integer): integer;
  { randa ma‘iausi… sk daliklŤ didesnŤ u‘ x }
  begin
    x := x + 1;
    while  sk mod x <> 0 do
      x := x + 1;
    daliklis := x;
  end; { daliklis }

  procedure ieskoti (au, pl: integer;
                     var aukstis, plotis, eil, st, dydis: integer);
  { tikrina, ar lape yra sta‡iakampis su skirtingomis raid‚mis, ku-   }
  { rio aukžtis yra au, o plotis - pl; jei randamas toks sta‡iakampis }
  { arba bent didesnis u‘ ankž‡iau surast…, tai Ťsimenami jo duomenys }
    var i, j, i1, j1: integer;
        nerasta, skirtingos: boolean;
        aibe: set of char;
  begin
    i := 1;  nerasta := true;
    while (i <= m-au+1) and nerasta do     { kairysis          }
      begin                                { viržutinis        }
       j := 1;                             { kampas yra        }
       while (j <= n-pl+1) and nerasta do  { eilut‚je i        }
         begin                             { ir stulpelyje j   }
           { tikrinama, ar sta‡iakampis su tokiais parametrais }
           { sudarytas iž skirting— raid‘i— }
           aibe := [];  skirtingos := true;
           i1 := i;
           while (i1 <= i+au-1) and skirtingos do
             begin
               j1 := j;
               while (j1 <= j+pl-1) and skirtingos do
                 if s[i1, j1] in aibe
                    then skirtingos := false
                    else begin
                           aibe := aibe + [s[i1, j1]];
                           j1 := j1 + 1;
                         end;
                if skirtingos
                   then i1 := i1 + 1;
              end; { while }
           if skirtingos  { radome ko iežkojome }
              then begin  nerasta := false;
                          aukstis := au; plotis := pl;
                          eil := i; st := j; dydis := au * pl;
                   end
              else begin  { radome ne tokŤ didelŤ sta‡iakampŤ kokio }
                          { iežkojome, bet gal didesnŤ nei iki žiol rast… }
                     { rasime paskutin‚s skirtingos raid‚s koordinatŠ }
                     if j1 = 1
                        then begin i1 := i1 - 1;
                                   j1 := j+pl-1
                             end
                        else j1 := j1 - 1;
                     if (i1-i+1) * (j1-j+1) > dydis
                        then begin
                               aukstis := i1-i+1; plotis := j1-j+1;
                               eil := i; st := j;
                               dydis := aukstis * plotis;
                              end
                         else if (i1-i)*pl > dydis
                                 then begin
                                        aukstis := i1-i; plotis := pl;
                                        eil := i; st := j;
                                        dydis := aukstis * plotis;
                                       end
                   end;
            j := j + 1;
          end;
       i := i + 1;
      end;
  end; { iežkoti }

  procedure rasti (var aukstis, plotis, eil, st: integer);
                   { iežkomo sta‡iakampio ižmatavimai ir kairiojo }
                   { viržutinio kampo koordinat‚s }
  { randa did‘iausi… sta‡iakampŤ su skirtingomis raid‚mis }
    var  didz, dydis, au, pl, i, j: integer;
  begin
    { rasime skirting— raid‘i— skai‡i— sta‡iakampyje }
    didz := skirt;  { didesnio sta‡iakampio negali b–ti }
    dydis := 1;   { did‘iausio iki žiol rasto sta‡iakampio dydis }
    eil := 1;  st := 1;
    aukstis := 1;   plotis := 1;
    { atliksime perrinkim… }
    while dydis < didz do    { iežkome sta‡iakampio, kurio dydis - did‘ }
      begin
        pl := 1;
        while pl <= didz do  { to sta‡iakampio plotis yra pl }
          begin
            au := didz div pl;
            if (au <= m) and (pl <= n)
               then ieskoti (au, pl, aukstis, plotis, eil, st, dydis);
            { randame tolesnŠ pl reikžmŠ }
            if pl < didz
               then pl := daliklis (didz, pl)
               else pl := pl + 1;
          end;
        didz := didz - 1;
     end;
  end; { rasti }

  var f: text;
     i, j,  aukstis, plotis, eil, st: integer;
begin
  { pradini— duomen— skaitymas }
  assign (f, 'STAC.DAT');
  reset (f);
  readln (f, m, n);
  for i := 1 to m do
    begin
      for j := 1 to n do
        read (f, s[i, j]);
      readln (f);
    end;
  close (f);
  { sta‡iakampio paiežka }
  rasti (aukstis, plotis, eil, st);
  { rezultat— ižvedimas }
  assign (f, 'STAC.REZ');
  rewrite (f);
  writeln (f, aukstis * plotis);
  for i := eil to eil+aukstis-1 do
    begin
      for j := st to st+plotis-1 do
        write (f, s[i, j]);
      writeln (f);
    end;
  close (f);
end.
