#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++;
    }
}