#include <bits/stdc++.h>
using namespace std;
int n,a[10][10];

//k表示赋值第k个斜边,t表示要赋值的起始值
//x y表示要赋值的起始位置 
void fun(int k,int t,int x,int y){
	 //递归出口 
	 if(x <= n && y <= n){
	 	//第奇数斜边,向右上 
	 	 if(k % 2 == 1){
	 	 	 //如果在矩阵中 
	 	     while(x >= 1 && y <= n){
	 	    	a[x][y] = t;
	 	    	x--;
	 	    	y++;
	 	    	t++;
			 }
			 x++;y--; 
		 }else{
		 	//向左下
			while(x <= n && y >= 1){
				a[x][y] = t;
				x++;
				y--;
				t++;
			}  
			x--;y++;
		 }
		 
		 //k<n奇数向右,偶数向下
		 if(k<n){
			 if(k % 2 == 1){
			 	  fun(k+1,t,x,y+1);		
			}else{
				  fun(k+1,t,x+1,y);
			}
		}else{
			 //否则偶数向右,奇数向下
			 if(k % 2 == 0){
			 	  fun(k+1,t,x,y+1);		
			 }else{
				  fun(k+1,t,x+1,y);
			 }	
		} 
	 }
}

int main(){
	int i,j;
	cin>>n;
	fun(1,1,1,1);
	for(i = 1;i <= n;i++){
		for(j = 1;j <= n;j++){
			cout<<setw(5)<<a[i][j];
		}
		cout<<endl;
	}
    return 0;
}

/**************************************************************
	Problem: 1382
	User: admin
	Language: C++
	Result: Accepted
	Time:8 ms
	Memory:2072 kb
****************************************************************/