#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    int matrix[1000][1000] = {0};  // n最大1000

    int num = 1;
    int i = 0, j = 0;
    int direction = 1;  // 1表示向右上移动,-1表示向左下移动

    while (num <= n * n) {
        matrix[i][j] = num++;

        // 根据当前方向计算下一个位置
        if (direction == 1) {  // 向右上移动
            if (j == n - 1) {  // 碰到右边界,向下移动
                i++;
                direction = -1;
            } else if (i == 0) {  // 碰到上边界,向右移动
                j++;
                direction = -1;
            } else {  // 继续向右上
                i--;
                j++;
            }
        } else {  // 向左下移动
            if (i == n - 1) {  // 碰到下边界,向右移动
                j++;
                direction = 1;
            } else if (j == 0) {  // 碰到左边界,向下移动
                i++;
                direction = 1;
            } else {  // 继续向左下
                i++;
                j--;
            }
        }
    }

    // 输出矩阵
    for (int x = 0; x < n; x++) {
        for (int y = 0; y < n; y++) {
            printf("%d", matrix[x][y]);
            if (y < n - 1) printf(" ");
        }
        printf("\n");
    }

    return 0;
}