#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int n;
    #ifdef Serpentine_matrix
    /*
    方法一
    思路:一个n*n矩阵,只填充上半矩阵,右上角进行填充,横坐标递减,纵坐标递增,
    例如[0,0];[-1, 0]、[0, 1];[-2, 0] 、[-1, 1]、[0, 2];
    [-3, 0]、[-2, 1] [-1, 2] [0, 3]
    */
    while(cin>>n) {
        vector<vector<int>> matrix(n, vector<int>(n, 0)); //n*n
        int num = 1;
        for(int i = 0; i < n; i++) {
            int j = i, k = 0;
            while(j >= 0) {
                matrix[j][k] = num;
                num++;
                j--;
                k++;
            }
        }
        
        for(int i = 0; i < n; i++) {
            int j = 0;
            while(matrix[i][j] != 0 && j < n) {
                cout<<matrix[i][j]<<" ";
                j++;
            }
             cout<<endl;
        }
    }
    #else
    /*
    数学规律
    具体做法:
    仔细观察这样的蛇形矩阵,我们可以尝试找规律:
    对于每一行第一个元素,我们发现2与1之间相差为1,4与2之间相差为2,7与4之间相差为3,11与7之间相差为4,则第iii行的第一个元素与它的下一行是相差
    了个行号(从1开始)。
    对于每一行的每个元素,我们发现3与1之间相差为2,6与3之间相差为3,10与6之间相差为4,15与10之间相差为5,则第jjj列与它的前一列相差为其列号
    (从1开始)。
    */
    while(cin>>n) {
        int k = 1; // 起始元素1
        for(int i = 1; i <= n; i++) {
            cout<<k<<" "; // 输出每行首
            int temp = k;
            for(int j = i + 1; j <= n; j++) {
                temp += j; // 一行的列相差j: 2、3、4 、5; 1 + 2 = 3;3 + 3 =6;6 + 4 = 10
                cout<<temp<<" ";
            }
            cout<<endl;
            k += i; //下一行, 1 + 1= 2; 2 + 2=4; 4 + 3 =7
        }
    }
    
    
    #endif
}