#include<bits/stdc++.h>
using namespace std;
vector<int> c,arr,id,hv;
vector<vector<pair<int,int>>> f;
int main(){
int n,k; cin>>n >>k;
vector<vector<int>> r,u;
r.resize(n+1,vector<int>(k+1,0));
u.resize(n+1,vector<int>(k+1,0));
f.resize(max(n,k)+1);
c.resize(max(n,k)+1);
hv.resize(max(n,k)+1);
arr.resize(max(n,k)+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
cin>>r[i][j];
f[j].push_back({r[i][j],i});
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
cin>>u[i][j];
}
}
id.resize(n+1,0);
for(int i=1;i<=k;i++) sort(f[i].begin(),f[i].end());
queue<int> q;
for(int i=1;i<=k;i++){
while(id[i]<f[i].size() && f[i][id[i]].first<=c[i]){
auto [val,idx]=f[i][id[i]];
c[idx]++;
if(c[idx]==k){
q.push(idx);
}
id[i]++;
}
}
int ret=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=1;i<=k;i++){
hv[i]+=u[x][i];
}
ret++;
for(int i=1;i<=k;i++){
while(id[i]<f[i].size() && f[i][id[i]].first<=hv[i]){
auto [val,idx]=f[i][id[i]];
c[idx]++;
if(c[idx]==k){
q.push(idx);
}
id[i]++;
}
}
}
cout<<ret;
}