#include<bits/stdc++.h>
using namespace std;
const int N=510;
int q[2*N][2*N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>q[i][j];
}
}
//行偏移 & 列偏移 0右 1左下 2下 3右上
int dx[]={0,1,1,-1}, dy[]={1,-1,0,1};
int d=0; //初始方向向右
cout<<q[0][0]<<' '; //先输出斜0行元素
//斜行起始点:(0,1)
int x=0, y=1;
//遍历【2*n个斜行】————>元素个数: (1+2*n)*(2*n) / 2
for(int i=0; i<=(1+2*n)*2*n/2-1;i++){
//不在扩展空间里————> 输出【当前位置(x,y)】
if(x<n && y<n){
cout<<q[x][y]<<' ';
}
//【下一个位置】
int a=x+dx[d], b=y+dy[d];
//(a,b)是否碰墙? (1)出界 (2)【规律】向右/下:都直走一格就要掉头
if(a<0 || a>=n || b<0 || b>=n || d==0 || d==2){
d=(d+1)%4;
a=x+dx[d], b=y+dy[d];
}
x=a, y=b; //更新(a,b)
}
return 0;
}