#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;

int h,w;
string s[20];
bool used[20];

deque<string>v;

bool C(){
	multiset<string>se;
	rep(i,w){
		string t;
		rep(j,h)t+=v[j][i];
		se.insert(t);
	}
	vector<string>a;
	while(!se.empty()){
		string t=*se.begin();se.erase(se.begin());
		string k;
		for(char c:t)k=c+k;
		auto it=se.find(k);
		if(it!=se.end()){
			se.erase(it);
		}
		else{
			a.push_back(t);
		}
	}
	if(w%2==0)return a.empty();
	if(a.size()>1)return 0;
	rep(i,h){
		if(a[0][i]!=a[0][h-i-1])return 0;
	}
	return 1;
}
void dfs(int i){
	if(i==h){
		if(C()){
			puts("YES");exit(0);
		}
		return;
	}
	if(used[i]){
		dfs(i+1);
		return;
	}
	used[i]=true;
	v.push_front(s[i]);
	rep(j,h){
		if(used[j])continue;
		used[j]=true;
		v.push_back(s[j]);
		dfs(i+1);
		used[j]=false;
		v.pop_back();
	}
	v.pop_front();
	used[i]=false;
}
int main(){
	cin>>h>>w;
	rep(i,h)cin>>s[i];
	if(h%2==1){
		rep(i,h){
			v.push_back(s[i]);
			used[i]=true;
			dfs(0);
			used[i]=false;
			v.pop_back();
		}
	}
	else{
		dfs(0);
	}
	puts("NO");
}