There is an H \times W grid (H vertical, W horizontal), where each square contains a lowercase English letter. Specifically, the letter in the square at the i-th row and j-th column is equal to the j-th character in the string S_i.

Snuke can apply the following operation to this grid any number of times:

* Choose two different rows and swap them. Or, choose two different columns and swap them.



Snuke wants this grid to be symmetric. That is, for any 1 \leq i \leq H and 1 \leq j \leq W, the letter in the square at the i-th row and j-th column and the letter in the square at the (H + 1 - i)-th row and (W + 1 - j)-th column should be equal.

Determine if Snuke can achieve this objective.

Constraints

* 1 \leq H \leq 12
* 1 \leq W \leq 12
* |S_i| = W
* S_i consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

If Snuke can make the grid symmetric, print `YES`; if he cannot, print `NO`.

Examples

Input

2 3
arc
rac


Output

YES


Input

3 7
atcoder
regular
contest


Output

NO


Input

12 12
bimonigaloaf
faurwlkbleht
dexwimqxzxbb
lxdgyoifcxid
ydxiliocfdgx
nfoabgilamoi
ibxbdqmzxxwe
pqirylfrcrnf
wtehfkllbura
yfrnpflcrirq
wvcclwgiubrk
lkbrwgwuiccv


Output

YES
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define gc() getchar()
inline int read(int r=0,int s=0,int c=gc()){for(;c<48||c>57;s=c,c=gc());for(;c>=48&&c<=57;(r*=10)+=c-48,c=gc());return s^'-'?r:-r;}
string s[15], S, R; unordered_set<string> g; int o[15], n, m, c; bool book[15];
inline void Check()
{
	for(rint i, j = 0; j < m; R = S, reverse(R.begin(),R.end()), g.count(R)?g.erase(R),0:(g.insert(S),0), j++) for(S = "", i = 1; i <= n; S += s[o[i++]][j]);
	if(!g.size()||(m&1&&g.size()==1&&(S=R=*g.begin(),reverse(R.begin(),R.end()),R==S))) return puts("YES"),exit(0); g.clear();
}
void DFS(int i, bool mid)
{
	if(c+1 >= -~n>>1){for(int j = 1, t = c; j <= n; !book[j] ? o[++t] = j : 0, j++); Check(); return;} if(book[i]){DFS(i+1,mid); return;} if(mid) DFS(i+1,0); 
	o[++c] = i, book[i] = true; for(int j = i+1; j <= n; !book[j] ? o[n-c+1] = j, book[j] = true, DFS(i+1,mid), book[j] = false : 0, j++); book[i] = false, --c;
}
int main(){n = read(), m = read(); for(rint i = 1; i <= n; cin >> s[i++]); DFS(1,n&1); return puts("NO"),0;}