#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int arr[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cin>>arr[i][j];
}
int x1=0,y1=0,x2=0,y2=0;//分别代表行目前的坐标和列目前的坐标
bool flag=true;//true是从左下到右上方向,false是右上到左下方向
for(int i=0;i<m+n-1;i++){//总的循环次数是边长之和减一因为顶点处重合了
if(flag){
int tempx=x1,tempy=y1;
while(tempx>=x2){
cout<<arr[tempx][tempy]<<" ";
tempx--;
tempy++;
}
}
else{
int tempx=x2,tempy=y2;
while(tempx<=x1){
cout<<arr[tempx][tempy]<<" ";
tempx++;
tempy--;
}
}
flag=!flag;//方向取反
if(x1==n-1){
y1++;
}
else x1++;
if(y2==m-1)
x2++;
else y2++;
}
}
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int arr[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cin>>arr[i][j];
}
int x1=0,y1=0,x2=0,y2=0;//分别代表行目前的坐标和列目前的坐标
bool flag=true;//true是从左下到右上方向,false是右上到左下方向
for(int i=0;i<m+n-1;i++){//总的循环次数是边长之和减一因为顶点处重合了
if(flag){
int tempx=x1,tempy=y1;
while(tempx>=x2){
cout<<arr[tempx][tempy]<<" ";
tempx--;
tempy++;
}
}
else{
int tempx=x2,tempy=y2;
while(tempx<=x1){
cout<<arr[tempx][tempy]<<" ";
tempx++;
tempy--;
}
}
flag=!flag;//方向取反
if(x1==n-1){
y1++;
}
else x1++;
if(y2==m-1)
x2++;
else y2++;
}
}