#include<iostream>
#include<vector>
using namespace std;
const int N = 20;
int n, m, k, b[N][N], c[N], ans = 0, ccnt = 0;
bool a[N];
vector<int> d[N];
void dfs(int x){
if(x == k+1){
bool fg = 0;
for(int i = 1; i <= m; i++){
if(a[b[1][i]]) fg = 1;
}
if(!fg) return;
for(int i = 1; i <= k; i++){
if(a[i]){
int cnt = 0;
for(int j: d[i]){
if(a[b[c[i]+1][j]] || c[i] == n) cnt++;
}
if(cnt < (d[i].size() + 1) / 2) return;
}
}
ans = max(ans, ccnt);
return;
}
a[x] = 0; ccnt++;
dfs(x+1); ccnt--;
a[x] = 1;
dfs(x+1);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> b[i][j];
k = max(b[i][j], k);
}
}
for(int i = n; i >= 1; i--){
for(int j = 1; j <= m; j++){
if(b[i][j] != 0){
if(c[b[i][j]] == 0) c[b[i][j]] = i;
if(i == c[b[i][j]]) d[b[i][j]].push_back(j);
}
}
}
dfs(1);
cout << ans;
return 0;
}