#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100;
int n, x, a[maxn+5][maxn+5];
ll dp[maxn+5]; //diem khi dung i ngay
void read() {
    cin >> n >> x;
    for (int i = 1; i<=n; ++i) {
        for (int j = 1; j<=x; ++j) cin >> a[i][j];
    }
}
void dequy(vector <int> v, int & res) {
    if (v.size() == n) {
        int days = 0;
        for (int val : v) days += val;
        int cur = 0;
        if (days <= x) {
            for (int i = 0; i<n; ++i) {
                cur += a[i+1][v[i]];
            }
            res = max(res, cur);
        }
        return;
    }
    for (int i = 0; i<=x; ++i) {
        v.push_back(i);
        dequy(v, res);
        v.pop_back();
    }
}
void sub1() {
    vector <int> v;
    int res = 0;
    dequy(v, res);
    cout << res;
}
void sub2() {
    int res = 0;
    for (int i = 1; i<=n; ++i) {
        res = max(res, a[i][1]);
    }
    cout << res;
}
void sub3() {
    for (int i = 1; i<=n; ++i) {
        ll new_dp[maxn+5];
        for (int j = 0; j<=x; ++j) new_dp[j] = 0;

        for (int g = 0; g<=x; ++g) {
            for (int h = 0; h<=g; ++h) {
                new_dp[g] = max(new_dp[g], 1LL * dp[g-h] + a[i][h]);
            }
        }

        for (int j = 0; j<=x; ++j) dp[j] = new_dp[j];
    }
    ll res = 0;
    for (int i = 0; i<=x; ++i) res = max(res, dp[i]);
    cout << res;
}
void solve() {
    if (n <= 4 && x <= 4) sub1();
    else if (x == 1) sub2();
    else sub3();
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    read();
    solve();
    return 0;
}
