#include <bits/stdc++.h>
using namespace std;
int a[200][200];
int n;
void scan(int lever,bool even)
{
int x,y;//确定起点坐标
x = lever > n ? n : lever;
y = lever > n ? (lever - n + 1) : 1;
char c;//选择输出间隔符号
c = (x == n && y == n) ? '\n' : ' ';
int times;//限制每层递减/递增次数
times = lever >= n ? (n - (lever - n)) : lever;
if(even) swap(x,y);//偶数层时,交换x,y即可得到起点坐标
for(int i = 0; i < times; i++)//每层对起点坐标作用times次,然后输出对应元素即可
printf("%d%c",even? a[x++][y--] : a[x--][y++],c);
return ;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
for(int lever = 1; lever <= 2 * n - 1; lever++)//循环层数
scan(lever,lever % 2 == 0);
return 0;
}