#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
typedef pair<int, int> pii;
using lld = long long int;
#define INF 1000000009
#define MAX_N 3009
struct Edge {
int s, t;
int f;
int c;
int ri;
Edge() {
s = t = 0;
f = c = ri = 0;
}
Edge(int s, int t, int c) :s(s), t(t), c(c) {
f = 0; ri = 0;
}
};
int adn;
vector<Edge> dinic_v[MAX_N];
void inil() {
int i, j, k;
for (i = 0; i < adn; i++) {
dinic_v[i].clear();
}
}
void add_edge(int si, int ei, int c, int cr = 0) {
dinic_v[si].push_back(Edge(si, ei, c));
dinic_v[ei].push_back(Edge(ei, si, cr));
dinic_v[si].back().ri = ((int)dinic_v[ei].size()) - 1;
dinic_v[ei].back().ri = ((int)dinic_v[si].size()) - 1;
}
int dinic_level[MAX_N];
int dinic_mark[MAX_N];
int dinic_que[MAX_N];
int dinic_q, dinic_r;
bool dinic_bfs(int si, int ei) {
int i, j, k;
for (i = 0; i < adn; i++) {
dinic_mark[i] = 0;
dinic_level[i] = -1;
}
dinic_q = dinic_r = 0;
dinic_level[si] = 0;
dinic_mark[si] = 1;
dinic_que[dinic_r++] = si;
while (dinic_q < dinic_r) {
int qi = dinic_que[dinic_q++];
for (i = 0; i < dinic_v[qi].size(); i++) {
if (dinic_v[qi][i].c - dinic_v[qi][i].f > 0) {
j = dinic_v[qi][i].t;
if (dinic_level[j] == -1) {
dinic_level[j] = dinic_level[qi] + 1;
dinic_mark[j] = 1;
dinic_que[dinic_r++] = j;
}
}
}
}
return dinic_mark[ei];
}
int dinic_vsi[MAX_N];
lld dinic_dfs(int si, int ei, int flow) {
int i, j, k;
if (si == ei)return flow;
for (int &i = dinic_vsi[si]; i < dinic_v[si].size(); i++) {
if (dinic_v[si][i].c - dinic_v[si][i].f > 0) {
j = dinic_v[si][i].t;
if (dinic_level[j] == dinic_level[si] + 1) {
int ff = min(flow, dinic_v[si][i].c - dinic_v[si][i].f);
int ret = dinic_dfs(j, ei, ff);
if (ret > 0) {
dinic_v[si][i].f += ret;
dinic_v[dinic_v[si][i].t][dinic_v[si][i].ri].f -= ret;
return ret;
}
}
}
}
return -1;
}
lld network_flow(int si, int ei) {
lld flow = 0;
while (dinic_bfs(si, ei)) {
for (int i = 0; i < adn; i++)dinic_vsi[i] = 0;
do {
int ret = dinic_dfs(si, ei, INF);
if (ret < 0)break;
flow += ret;
} while (1);
}
return flow;
}
////
int n,m;
// minimize r0+r1+c0+c1+c2 when A*x >= a
// LP dual
// maximize a[][]*y when At*y <= 1 <-- min cost max flow
int main(){
int i,j,k;
scanf("%d %d",&n,&m);
adn=n+m+2;
inil();
for(i=0;i<n;i++){
add_edge(adn-2,i,INF);
for(j=0;j<m;j++){
scanf("%d",&k);
add_edge(i,j+n,k);
}
}
for(i=0;i<m;i++){
add_edge(i+n,adn-1,INF);
}
printf("%lld\n",network_flow(adn-2,adn-1));
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTxtYXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp1c2luZyBsbGQgPSBsb25nIGxvbmcgaW50OwojZGVmaW5lIElORiAxMDAwMDAwMDA5CiNkZWZpbmUgTUFYX04gMzAwOQpzdHJ1Y3QgRWRnZSB7CglpbnQgcywgdDsKCWludCBmOwoJaW50IGM7CglpbnQgcmk7CglFZGdlKCkgewoJCXMgPSB0ID0gMDsKCQlmID0gYyA9IHJpID0gMDsKCX0KCUVkZ2UoaW50IHMsIGludCB0LCBpbnQgYykgOnMocyksIHQodCksIGMoYykgewoJCWYgPSAwOyByaSA9IDA7Cgl9Cn07CmludCBhZG47CnZlY3RvcjxFZGdlPiBkaW5pY192W01BWF9OXTsKdm9pZCBpbmlsKCkgewoJaW50IGksIGosIGs7Cglmb3IgKGkgPSAwOyBpIDwgYWRuOyBpKyspIHsKCQlkaW5pY192W2ldLmNsZWFyKCk7Cgl9Cn0Kdm9pZCBhZGRfZWRnZShpbnQgc2ksIGludCBlaSwgaW50IGMsIGludCBjciA9IDApIHsKCWRpbmljX3Zbc2ldLnB1c2hfYmFjayhFZGdlKHNpLCBlaSwgYykpOwoJZGluaWNfdltlaV0ucHVzaF9iYWNrKEVkZ2UoZWksIHNpLCBjcikpOwoJZGluaWNfdltzaV0uYmFjaygpLnJpID0gKChpbnQpZGluaWNfdltlaV0uc2l6ZSgpKSAtIDE7CglkaW5pY192W2VpXS5iYWNrKCkucmkgPSAoKGludClkaW5pY192W3NpXS5zaXplKCkpIC0gMTsKfQppbnQgZGluaWNfbGV2ZWxbTUFYX05dOwppbnQgZGluaWNfbWFya1tNQVhfTl07CmludCBkaW5pY19xdWVbTUFYX05dOwppbnQgZGluaWNfcSwgZGluaWNfcjsKYm9vbCBkaW5pY19iZnMoaW50IHNpLCBpbnQgZWkpIHsKCWludCBpLCBqLCBrOwoJZm9yIChpID0gMDsgaSA8IGFkbjsgaSsrKSB7CgkJZGluaWNfbWFya1tpXSA9IDA7CgkJZGluaWNfbGV2ZWxbaV0gPSAtMTsKCX0KCWRpbmljX3EgPSBkaW5pY19yID0gMDsKCWRpbmljX2xldmVsW3NpXSA9IDA7CglkaW5pY19tYXJrW3NpXSA9IDE7CglkaW5pY19xdWVbZGluaWNfcisrXSA9IHNpOwoJd2hpbGUgKGRpbmljX3EgPCBkaW5pY19yKSB7CgkJaW50IHFpID0gZGluaWNfcXVlW2RpbmljX3ErK107CgkJZm9yIChpID0gMDsgaSA8IGRpbmljX3ZbcWldLnNpemUoKTsgaSsrKSB7CgkJCWlmIChkaW5pY192W3FpXVtpXS5jIC0gZGluaWNfdltxaV1baV0uZiA+IDApIHsKCQkJCWogPSBkaW5pY192W3FpXVtpXS50OwoJCQkJaWYgKGRpbmljX2xldmVsW2pdID09IC0xKSB7CgkJCQkJZGluaWNfbGV2ZWxbal0gPSBkaW5pY19sZXZlbFtxaV0gKyAxOwoJCQkJCWRpbmljX21hcmtbal0gPSAxOwoJCQkJCWRpbmljX3F1ZVtkaW5pY19yKytdID0gajsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiBkaW5pY19tYXJrW2VpXTsKfQppbnQgZGluaWNfdnNpW01BWF9OXTsKbGxkIGRpbmljX2RmcyhpbnQgc2ksIGludCBlaSwgaW50IGZsb3cpIHsKCWludCBpLCBqLCBrOwoJaWYgKHNpID09IGVpKXJldHVybiBmbG93OwoJZm9yIChpbnQgJmkgPSBkaW5pY192c2lbc2ldOyBpIDwgZGluaWNfdltzaV0uc2l6ZSgpOyBpKyspIHsKCQlpZiAoZGluaWNfdltzaV1baV0uYyAtIGRpbmljX3Zbc2ldW2ldLmYgPiAwKSB7CgkJCWogPSBkaW5pY192W3NpXVtpXS50OwoJCQlpZiAoZGluaWNfbGV2ZWxbal0gPT0gZGluaWNfbGV2ZWxbc2ldICsgMSkgewoJCQkJaW50IGZmID0gbWluKGZsb3csIGRpbmljX3Zbc2ldW2ldLmMgLSBkaW5pY192W3NpXVtpXS5mKTsKCQkJCWludCByZXQgPSBkaW5pY19kZnMoaiwgZWksIGZmKTsKCQkJCWlmIChyZXQgPiAwKSB7CgkJCQkJZGluaWNfdltzaV1baV0uZiArPSByZXQ7CgkJCQkJZGluaWNfdltkaW5pY192W3NpXVtpXS50XVtkaW5pY192W3NpXVtpXS5yaV0uZiAtPSByZXQ7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAtMTsKfQpsbGQgbmV0d29ya19mbG93KGludCBzaSwgaW50IGVpKSB7CiAgICBsbGQgZmxvdyA9IDA7Cgl3aGlsZSAoZGluaWNfYmZzKHNpLCBlaSkpIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IGFkbjsgaSsrKWRpbmljX3ZzaVtpXSA9IDA7CgkJZG8gewogICAgICAgICAgICBpbnQgcmV0ID0gZGluaWNfZGZzKHNpLCBlaSwgSU5GKTsKCQkJaWYgKHJldCA8IDApYnJlYWs7CgkJCWZsb3cgKz0gcmV0OwoJCX0gd2hpbGUgKDEpOwoJfQoJcmV0dXJuIGZsb3c7Cn0KLy8vLwppbnQgbixtOwovLyBtaW5pbWl6ZSByMCtyMStjMCtjMStjMiB3aGVuIEEqeCA+PSBhCi8vIExQIGR1YWwKLy8gbWF4aW1pemUgYVtdW10qeSB3aGVuIEF0KnkgPD0gMSA8LS0gbWluIGNvc3QgbWF4IGZsb3cKaW50IG1haW4oKXsKICAgIGludCBpLGosazsKICAgIHNjYW5mKCIlZCAlZCIsJm4sJm0pOwogICAgYWRuPW4rbSsyOwogICAgaW5pbCgpOwogICAgZm9yKGk9MDtpPG47aSsrKXsKICAgICAgICBhZGRfZWRnZShhZG4tMixpLElORik7CiAgICAgICAgZm9yKGo9MDtqPG07aisrKXsKICAgICAgICAgICAgc2NhbmYoIiVkIiwmayk7CiAgICAgICAgICAgIGFkZF9lZGdlKGksaituLGspOwogICAgICAgIH0KICAgIH0KICAgIGZvcihpPTA7aTxtO2krKyl7CiAgICAgICAgYWRkX2VkZ2UoaStuLGFkbi0xLElORik7CiAgICB9CiAgICBwcmludGYoIiVsbGRcbiIsbmV0d29ya19mbG93KGFkbi0yLGFkbi0xKSk7Cn0=