var n,m:integer;
a:array[1..1000,1..1000]of longint;
b:array[0..1000,0..1000]of boolean;
vizitate: longint;
i, j:integer;
begin

  read(n,m);
  for i:=1 to n do
  begin
     for j:=1 to m do
     read(a[i,j]);
  end;

  for i:=1 to n do
  begin
      for j:=1 to m do
      b[i,j]:=false;
  end;

  i := 1;
  j := 1;
  b[1,m+1]:=true;
  b[n+1,m]:=true;
var n,m:integer;
a:array[1..1000,1..1000]of longint;
b:array[0..1000,0..1000]of boolean;
vizitate: longint;
i, j, x, y:integer;
begin

  read(n,m);
  for i:=1 to n do
  begin
     for j:=1 to m do
     read(a[i,j]);
  end;

  for i:=1 to n do
  begin
      for j:=1 to m do
      b[i,j]:=false;
  end;

  i := 1;
  j := 1;
  b[1,m+1]:=true;
  b[n+1,m]:=true;
  b[n,0]:=true;

  while vizitate < n * m do
  begin
     {parcurgere stanga->dreapta}
     while not b[i,j] do
     begin
            write(a[i,j],' ');
            b[i,j]:=true;

            if not b[i, j+1] then
                inc(j);
            inc(vizitate);
     end;
     inc(i);

     { writeln('am ajuns in coordonatele (',i,',',j,')'); }

     {for x := 1 to n do begin
         for y := 1 to m do
             if b[x,y] then write('1 ')
                       else write('0 ');

         writeln;
     end;}


     while not b[i,j] do
     begin
            write(a[i,j],' ');
            b[i,j]:=true;
            if not b[i+1, j] then inc(i);
            inc(vizitate);
     end;
     j := j-1;

     while not b[i,j] do
     begin
            write(a[i,j],' ');
            b[i,j]:=true;
            if not b[i, j-1] then j:=j-1;
            inc(vizitate);
     end;
     i := i-1;


     while not b[i,j] do
     begin
            write(a[i,j],' ');
            b[i,j]:=true;
            if not b[i-1, j] then i:=i-1;
            inc(vizitate);
     end;
     inc(j);
  end;
  writeln;
end.