#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
 
int H, W;
char S[15][15];
int sm_c[15][15];
int sm_r[15][15];
int as[15];
int as1[15];
int as2[15];
int sm1[15];
int sm2[15];
int suc;
 
int same(int ii, int jj)
{
	int i;
	for(i=0; i<W; i++){
		if(S[ii][as1[i]] != S[jj][as1[W-1-i]])
			return 0;
	}
	return 1;
}
 
void srch2(int dep)
{
	int i;
	if(suc == 1)
		return ;
	if(dep==H/2*2){
		suc = 1;
		return ;
	}
	if(dep%2==0){
		/*if(H%2==1 && dep==H-1){
			if(same(as2[dep], as2[dep]) == 1)
				srch2(dep+1);
		}
		else	
			srch2(dep+1);
		return ;*/
		srch2(dep+1);
	}
	for(i=dep; i<H/2*2; i++){
		swap(as2[i], as2[dep]);
		if(sm_r[as2[dep]][as2[dep-1]] == 1){
			if(same(as2[dep], as2[dep-1]) == 1)
				srch2(dep+1);
		}
		if(suc == 1)
			return ;
		swap(as2[i], as2[dep]);
	}
}
 
void srch(int dep)
{
	int i;
	if(suc == 1)
		return ;
	if(dep==W/2*2){
		for(i=0; i<H; i++)
			as2[i] = i;
		for(i=0; i<W; i++){
			if(i%2==0){
				as1[i/2] = as[i];
			}
			else
				as1[W-1-i/2] = as[i];
		}
		if(H%2==0)
			srch2(0);
		else{
			for(i=0; i<H; i++){
				swap(as2[H-1], as2[i]);
				if(same(as2[H-1], as2[H-1]) == 1)
					srch2(0);
				if(suc)
					return ;
				swap(as2[H-1], as2[i]);
			}
		}
		//srch2(0);
		return ;
	}
	if(dep%2==0){
		/*if(W%2==1 && dep==W-1){
			if(sm1[as[dep]]==1)
				srch(dep+1);
		}
		else	
			srch(dep+1);
		return ;*/
		srch(dep+1);
		return ;
	}
	int W2 = W/2*2;
	for(i=dep; i<W2; i++){
		swap(as[i], as[dep]);
		if(sm_c[as[dep]][as[dep-1]] == 1)
			srch(dep+1);
		if(suc == 1)
			return ;
		swap(as[i], as[dep]);
	}
}
 
void solve()
{
	int i, j, k;
	for(i=0; i<W; i++){
		for(j=0; j<W; j++){
			int a1[26], a2[26];
			for(k=0; k<26; k++)
				a1[k] = a2[k] = 0;
			for(k=0; k<H; k++){
				a1[S[k][i]-'a'] ++;
				a2[S[k][j]-'a'] ++;
			}
			for(k=0; k<26; k++){
				if(a1[k] != a2[k])
					break;
			}
			if(k==26)
				sm_c[i][j] = 1;
			else
				sm_c[i][j] = 0;
		}
	}
	for(i=0; i<H; i++){
		for(j=0; j<H; j++){
			int a1[26], a2[26];
			for(k=0; k<26; k++)
				a1[k] = a2[k] = 0;
			for(k=0; k<W; k++){
				a1[S[i][k]-'a'] ++;
				a2[S[j][k]-'a'] ++;
			}
			for(k=0; k<26; k++){
				if(a1[k] != a2[k])
					break;
			}
			if(k==26)
				sm_r[i][j] = 1;
			else
				sm_r[i][j] = 0;
		}
	}
	for(i=0; i<W; i++){
		int a1[26];
		for(k=0; k<26; k++)
			a1[k] = 0;
		for(k=0; k<H; k++){
			a1[S[k][i]-'a'] ++;
		}
		int tmp=0;
		for(k=0; k<26; k++){
			if(a1[k]%2==1)
				tmp ++;
		}
		if(tmp<=1)
			sm1[i] = 1;
		else
			sm1[i] = 0;
	}
	for(i=0; i<H; i++){
		int a1[26];
		for(k=0; k<26; k++)
			a1[k] = 0;
		for(k=0; k<W; k++){
			a1[S[i][k]-'a'] ++;
		}
		int tmp=0;
		for(k=0; k<26; k++){
			if(a1[k]%2==1)
				tmp ++;
		}
		if(tmp<=1)
			sm2[i] = 1;
		else
			sm2[i] = 0;
	}
	suc = 0;
	for(i=0; i<W; i++)
		as[i] = i;
	if(W%2==0)
		srch(0);
	else{
		for(i=0; i<W; i++){
			swap(as[W-1], as[i]);
			srch(0);
			if(suc)
				break ;
			swap(as[W-1], as[i]);
		}
	}
	if(suc)
		printf("YES\n");
	else
		printf("NO\n");
}

void test1()
{
	int i, j;
	int ii, jj;
	H = rand() % 6 + 1;
	W = rand() % 6 + 1;
	for(i=0; i<H; i++){
		for(j=0; j<W; j++)
			S[i][j] = 'a'+(rand()%26);
	}
	for(i=0; i<H; i++){
		for(j=W/2; j<W; j++){
			S[i][j] = S[H-1-i][W-1-j];
		}
	}
	for(i=0; i<20; i++){
		ii = rand() % W;
		jj = rand() % W;
		for(j=0; j<H; j++){
			swap(S[j][ii], S[j][jj]);
		}
	}
	for(i=0; i<20; i++){
		ii = rand() % H;
		jj = rand() % H;
		for(j=0; j<W; j++){
			swap(S[ii][j], S[jj][j]);
		}
	}
	solve();
}

void test()
{
	int i;
	for(i=0; i<50; i++)
		test1();
}
 
int main()
{
	//test();
	//freopen("in.txt", "r", stdin);
	int i;
	scanf("%d%d", &H, &W);
	for(i=0; i<H; i++)
		scanf("%s", S[i]);
	solve();
	return 0;
}

Measured memory_bytes: 256