#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define fi first
#define se second
#define unmap unordered_map
#define unset unordered_set
#define double long double
using namespace std;
const int dx[4]{-1, 0, 1, 0}, dy[4]{0, 1, 0, -1}; //0: Up 1: Right 2: Down 3: Left
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) {
x = y;
return true;
}
return false;
}
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) {
x = y;
return true;
}
return false;
}
template<class X, class Y>
void setvaluable(X &x, const Y &y) {
if (x==-1 || x > y) x = y;
}
int n, k;
vector<vector<int>>a, u;
void sub1() {
bool ok=true;
for (int i=0;i<k;i++) {
if (a[0][i]) {ok=false;break;}
}
cout << ok;
}
set<int>reach, can;
vector<int>cur, dele;
int cnt;
void sub2() {
cur.resize(k, 0);
for (int i=0;i<n;i++) reach.insert(i);
while (!reach.empty()) {
can.clear();
dele.clear();
for (int i:reach) can.insert(i);
for (int i:can) {
bool ok=true;
for (int j=0;j<k;j++) {
if (cur[j]<a[i][j]) {ok=false;break;}
}
if (!ok) dele.push_back(i);
}
for (int i:dele) can.erase(i);
if (can.empty()) break;
dele.clear();
for (int i:can) {
cnt++;
for (int j=0;j<k;j++) cur[j]+=u[i][j];
dele.push_back(i);
}
for (int i:dele) reach.erase(i);
}
cout << cnt;
}
vector<pair<int,int>>b;
int curr;
void sub3() {
for (int i=0;i<n;i++) b.push_back({a[i][0], i});
sort(b.begin(), b.end());
for (int i=0;i<n;i++) {
if (curr<b[i].fi) break;
curr+=u[b[i].se][0];
cnt++;
}
cout << cnt;
}
void solve()
{
cin >> n >> k;
a.resize(n, vector<int>(k, 0));
u.resize(n, vector<int>(k, 0));
for (int i=0;i<n;i++) {
for (int j=0;j<k;j++) cin >> a[i][j];
}
for (int i=0;i<n;i++) {
for (int j=0;j<k;j++) cin >> u[i][j];
}
if (n==1) sub1();
else if (k==1) sub3();
else sub2();
}
signed main() {
//ios_base::sync_with_stdio(false);cin.tie(0);
int numtest=1; //cin >> numtest;
while (numtest--) {solve();}
return 0;
}