#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
using ll = long long;
using uint = unsigned int;
using graph = std::vector<std::vector<ll>>;
using wGraph = std::vector<std::vector<std::pair<ll,ll>>>;
#define rep(i,n) for (int i=0; i < int(n); i++)

using namespace std;
ll MOD7 = 1000000007;
ll MOD9 = 1000000009;
vector<ll> InputVec(ll N){
    vector<ll> A(N);
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
    }
    return A;
}
void OutputVec(vector<ll> A){
    for (int i = 0; i < A.size(); ++i) {
        cout << A[i] << ",";
    }
    cout << endl;
}
vector<vector<ll>> InputVec2d(ll H,ll W){
    vector<vector<ll>> A(H);
    for (int yi = 0; yi < H; ++yi) {
        A[yi] = vector<ll>(W);
    }
    for (int yi = 0; yi < H; ++yi) {
        for (int xi = 0; xi < W; ++xi) {
            cin >> A[yi][xi];
        }
    }
    return A;
}
vector<vector<char>> InputVec2dStr(ll H,ll W){
    vector<vector<char>> A(H);
    for (int yi = 0; yi < H; ++yi) {
        A[yi] = vector<char>(W);
    }
    for (int yi = 0; yi < H; ++yi) {
        string S;
        cin >> S;
        for (int xi = 0; xi < W; ++xi) {
            A[yi][xi] = S[xi];
        }
    }
    return A;
}
void OutputVec2d(vector<vector<ll>> A){
    for (int yi = 0; yi < A.size(); ++yi) {
        for (int xi = 0; xi < A[yi].size(); ++xi) {
            cout << A[yi][xi] << ",";
        }
        cout << endl;
    }
}
graph InputGraph(ll N,ll M){
    graph G(N);
    for (int i = 0; i < M; ++i) {
        ll a,b;
        cin >> a >> b;
        a--;b--;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    return G;
}
graph InputDGraph(ll N,ll M){
    graph G(N);
    for (int i = 0; i < M; ++i) {
        ll a,b;
        cin >> a >> b;
        a--;b--;
        G[a].push_back(b);
    }
    return G;
}
void OutputGraph(graph G){
    for (int i = 0; i < G.size(); ++i) {
        cout << i << ":";
        for (int j = 0; j < G[i].size(); ++j) {
            cout << G[i][j]<< ",";
        }
        cout << endl;
    }
}
void OutputAnswerBool(bool b,bool isUpperCase = false){
    if(b){
        if(isUpperCase){
            cout << "YES" << endl;
        }else{
            cout << "Yes" << endl;
        }
    }else{
        if(isUpperCase){
            cout << "NO" << endl;
        }else{
            cout << "No" << endl;
        }
    }
}

int main() {
    ll N,M;
    cin >> N >> M;
    auto A = InputVec2d(N,M);
    vector<bool> b(M);
    for (int i = 0; i < M; ++i) {
        b[i] = true;
    }
    ll m = N;
    for (int i = 0; i < M; ++i) {
        vector<ll> bucket(M);
        for (int ni = 0; ni < N; ++ni) {
            for (int mi = 0; mi < M; ++mi) {
                if(b[A[ni][mi]-1]){
                    bucket[A[ni][mi]-1]++;
                    break;
                }
            }
        }
        ll del = -1;
        for (int j = 0; j < M; ++j) {
            if(b[j]){
                if(del == -1){
                    del = j;
                }
                if(bucket[j] >= bucket[del]){
                    del = j;
                }
            }
        }
        m = min(m,bucket[del]);
        b[del] = false;
    }
    cout << m << endl;
}

#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(), v.end()
typedef long long ll;
typedef pair<ll,ll> P;
typedef vector<ll> vec;
typedef vector<vec> mat;
int main(){
    int n,m,A[301][301],B[301][301];
    cin>>n>>m;
    rep(i,n)rep(j,m) cin>>A[i][j],B[i][A[i][j]]=j+1;
    int num[301],ans=n;
    rep(i,m) num[i+1]=1;
    rep(i,m){
        int C[301]={0};
        rep(j,n){
            int a=m,b;
            rep(k,m) if(num[k+1]){
                if(a>=B[j][k+1]) a=B[j][k+1],b=k+1;
            }
            C[b]++;
        }
        int a=0,b;
        rep(j,m) if(a<=C[j+1]) a=C[j+1],b=j+1;
        ans=min(ans,a),num[b]--;
    }
    cout<<ans<<"\n";
}