#include<stdio.h>
typedef struct Dice{int t,s,e,w,n,b;}dice;
void koro(dice *d,char *h);
void koro_to_ewn(dice *di_kijun,dice *di_tmp);
void hikaku(dice *di,dice *di_kijun);
int check(dice *di_kijun,dice *di_check);
int hante=0;
 
int main(void){
    dice di_kijun,di;
    int n,i,j,dice[101][7];
	
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<6;j++){
			scanf("%d",&dice[i][j]);
		}
	}

	for(i=1;i<n;i++){
		di_kijun.t=dice[i][0];di_kijun.s=dice[i][1];di_kijun.e=dice[i][2];
		di_kijun.w=dice[i][3];di_kijun.n=dice[i][4];di_kijun.b=dice[i][5];
		for(j=0;j<=i-1;j++){
			di.t=dice[j][0];di.s=dice[j][1];di.e=dice[j][2];
			di.w=dice[j][3];di.n=dice[j][4];di.b=dice[j][5];
			hikaku(&di,&di_kijun);
			if (hante) break;
		}
	if(hante) break;
	}
	printf("%s\n",hante?"No":"Yes");
	return 0;
}

void hikaku(dice *di,dice *di_kijun){
	dice di_tmp;
    while(1){
        if(di->t==di_kijun->t){
            di_tmp=*di;
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        if(hante) break;
        if(di->s==di_kijun->t){
            di_tmp=*di;
            koro(&di_tmp,"N");
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        if(hante) break;
        if(di->e==di_kijun->t){
            di_tmp=*di;
            koro(&di_tmp,"W");
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        if(hante) break;
        if(di->w==di_kijun->t){
            di_tmp=*di;
            koro(&di_tmp,"E");
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        if(hante) break;
        if(di->n==di_kijun->t){
            di_tmp=*di;
            koro(&di_tmp,"S");
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        if(hante) break;
        if(di->b==di_kijun->t){
            di_tmp=*di;
            koro(&di_tmp,"S");koro(&di_tmp,"S");
            if(check(di_kijun,&di_tmp)) break;
            koro_to_ewn(di_kijun,&di_tmp);
        }
        break;
    }
}
 
 
void koro(dice *d,char *h){
    dice dbuf;
    dbuf.t=d->t;dbuf.s=d->s;dbuf.e=d->e;dbuf.w=d->w;dbuf.n=d->n;dbuf.b=d->b;
    switch(*h){
        case 'S':
            d->t=dbuf.n;
            d->s=dbuf.t;
            d->e=dbuf.e;
            d->w=dbuf.w;
            d->n=dbuf.b;
            d->b=dbuf.s;
            break;
        case 'E':
            d->t=dbuf.w;
            d->s=dbuf.s;
            d->e=dbuf.t;
            d->w=dbuf.b;
            d->n=dbuf.n;
            d->b=dbuf.e;
            break;
        case 'W':
            d->t=dbuf.e;
            d->s=dbuf.s;
            d->e=dbuf.b;
            d->w=dbuf.t;
            d->n=dbuf.n;
            d->b=dbuf.w;
            break;
        case 'N':
            d->t=dbuf.s;
            d->s=dbuf.b;
            d->e=dbuf.e;
            d->w=dbuf.w;
            d->n=dbuf.t;
            d->b=dbuf.n;
            break;
    }
}
 
void koro_to_ewn(dice *di_kijun,dice *di_tmp){
    do{
    if(di_tmp->e==di_kijun->s){koro(di_tmp,"W");koro(di_tmp,"S");koro(di_tmp,"E");}
    if(check(di_kijun,di_tmp)) break;
    if(di_tmp->w==di_kijun->s){koro(di_tmp,"E");koro(di_tmp,"S");koro(di_tmp,"W");}       
    if(check(di_kijun,di_tmp)) break;
    if(di_tmp->n==di_kijun->s){koro(di_tmp,"S");koro(di_tmp,"S");koro(di_tmp,"E");koro(di_tmp,"E");} 
    if(check(di_kijun,di_tmp)) break;
    }while(0);
}
 
int check(dice *di_kijun,dice *di_check){
    if (di_kijun->t==di_check->t && di_kijun->s==di_check->s && di_kijun->e==di_check->e &&
        di_kijun->w==di_check->w && di_kijun->n==di_check->n && di_kijun->b==di_check->b){
        hante=1;
        return 1;
    }
    else
        return 0;
}

Measured memory_bytes: 584