#include <stdio.h>
#include <string.h>
char a[1000][1000];

//i是矩阵的维度
//i+1到i+dimension是矩阵的数据
//对矩阵数据进行判断,最后输出结果
void judge(int i, int dimension) {
    //先将数据读入到array数组中
    //printf("\n%d\n", dimension);
    int array[dimension][dimension];
    int m, n, value = 0, start;
    for (start = 0; start < dimension; start++) {
        for (m = 0, n = 0; m <= strlen(a[i + start]); m++) {
            if (a[i + start][m] == ' ' || m == strlen(a[i + start])) {
                //printf("%d ", value);
                array[start][n++] = value;
                value = 0;
                continue;
            }
            value = value * 10 + a[i + start][m] - '0';
        }
        //printf("--%d\n", strlen(a[i + start]));
    }

    //输出数组
    for (m = 0; m < dimension; m++) {
        for (n = 0; n < dimension; n++) {
            //printf("%d ", array[m][n]);
        }
        //printf("\n");
    }

    //判断数组是否是对称矩阵
    for (m = 0; m < dimension; m++) {
        for (n = m; n < dimension; n++) {
            if(array[m][n]!=array[n][m]){
                printf("No!\n");
                return ;
            }
        }
    }
    printf("Yes!\n");
    return ;
}

int main() {

    int number = 0;
    while (gets(a[number])) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to
        //printf("%s\n", a[number]);
        number++;
    }

    //printf("%s\n",a[0]);
    int i = 0, j, len, dimension = 0;
    while (i < number) {
        dimension = 0;
        len = strlen(a[i]);
        for (j = 0; j < len; j++) {
            dimension = 10 * dimension + a[i][j] - '0';
        }
        //printf("%d\n",dimension);
        judge(i + 1, dimension);
        i = i + dimension + 1;
    }
    return 0;
}