#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll NEG_INF = -(ll)4e18;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<ll>> v(n);
vector<int> sz(n);
for(int i = 0; i < n; i++){
cin >> sz[i];
v[i].resize(sz[i]);
for(int j = 0; j < sz[i]; j++){
cin >> v[i][j];
}
}
// 1) For each shelf i, precompute best[i][k] = max sum by taking exactly k items from its two ends.
vector<vector<ll>> best(n, vector<ll>(m+1, NEG_INF));
for(int i = 0; i < n; i++){
int s = sz[i];
// prefix sums from left, suffix sums from right
vector<ll> pref(s+1, 0), suff(s+1, 0);
for(int j = 1; j <= s; j++){
pref[j] = pref[j-1] + v[i][j-1];
suff[j] = suff[j-1] + v[i][s-j];
}
best[i][0] = 0;
// try all splits: take L from left, R from right, L+R = k
for(int k = 1; k <= s; k++){
ll mx = 0;
for(int L = 0; L <= k; L++){
int R = k - L;
if(R > s) continue;
mx = max(mx, pref[L] + suff[R]);
}
best[i][k] = mx;
}
}
vector<ll> dp(m+1, NEG_INF);
dp[0] = 0;
for(int i = 0; i < n; i++){
// iterate backwards so we don't reuse shelf i more than once
for(int used = m; used >= 0; used--){
if(dp[used] == NEG_INF) continue;
// try smashing k items from shelf i
for(int k = 1; k <= sz[i] && used + k <= m; k++){
dp[used + k] = max(dp[used + k],
dp[used] + best[i][k]);
}
}
}
// 3) Answer is dp[m]
cout << dp[m] << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBsbCBORUdfSU5GID0gLShsbCk0ZTE4OwoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4sIG07CiAgICBjaW4gPj4gbiA+PiBtOwogICAgdmVjdG9yPHZlY3RvcjxsbD4+IHYobik7CiAgICB2ZWN0b3I8aW50PiBzeihuKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgICAgIGNpbiA+PiBzeltpXTsKICAgICAgICB2W2ldLnJlc2l6ZShzeltpXSk7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHN6W2ldOyBqKyspewogICAgICAgICAgICBjaW4gPj4gdltpXVtqXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gMSkgRm9yIGVhY2ggc2hlbGYgaSwgcHJlY29tcHV0ZSBiZXN0W2ldW2tdID0gbWF4IHN1bSBieSB0YWtpbmcgZXhhY3RseSBrIGl0ZW1zIGZyb20gaXRzIHR3byBlbmRzLgogICAgdmVjdG9yPHZlY3RvcjxsbD4+IGJlc3QobiwgdmVjdG9yPGxsPihtKzEsIE5FR19JTkYpKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgICAgIGludCBzID0gc3pbaV07CiAgICAgICAgLy8gcHJlZml4IHN1bXMgZnJvbSBsZWZ0LCBzdWZmaXggc3VtcyBmcm9tIHJpZ2h0CiAgICAgICAgdmVjdG9yPGxsPiBwcmVmKHMrMSwgMCksIHN1ZmYocysxLCAwKTsKICAgICAgICBmb3IoaW50IGogPSAxOyBqIDw9IHM7IGorKyl7CiAgICAgICAgICAgIHByZWZbal0gPSBwcmVmW2otMV0gKyB2W2ldW2otMV07CiAgICAgICAgICAgIHN1ZmZbal0gPSBzdWZmW2otMV0gKyB2W2ldW3Mtal07CiAgICAgICAgfQogICAgICAgIGJlc3RbaV1bMF0gPSAwOwogICAgICAgIC8vIHRyeSBhbGwgc3BsaXRzOiB0YWtlIEwgZnJvbSBsZWZ0LCBSIGZyb20gcmlnaHQsIEwrUiA9IGsKICAgICAgICBmb3IoaW50IGsgPSAxOyBrIDw9IHM7IGsrKyl7CiAgICAgICAgICAgIGxsIG14ID0gMDsKICAgICAgICAgICAgZm9yKGludCBMID0gMDsgTCA8PSBrOyBMKyspewogICAgICAgICAgICAgICAgaW50IFIgPSBrIC0gTDsKICAgICAgICAgICAgICAgIGlmKFIgPiBzKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIG14ID0gbWF4KG14LCBwcmVmW0xdICsgc3VmZltSXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYmVzdFtpXVtrXSA9IG14OwogICAgICAgIH0KICAgIH0KCiAgICB2ZWN0b3I8bGw+IGRwKG0rMSwgTkVHX0lORik7CiAgICBkcFswXSA9IDA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBzbyB3ZSBkb24ndCByZXVzZSBzaGVsZiBpIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgZm9yKGludCB1c2VkID0gbTsgdXNlZCA+PSAwOyB1c2VkLS0pewogICAgICAgICAgICBpZihkcFt1c2VkXSA9PSBORUdfSU5GKSBjb250aW51ZTsKICAgICAgICAgICAgLy8gdHJ5IHNtYXNoaW5nIGsgaXRlbXMgZnJvbSBzaGVsZiBpCiAgICAgICAgICAgIGZvcihpbnQgayA9IDE7IGsgPD0gc3pbaV0gJiYgdXNlZCArIGsgPD0gbTsgaysrKXsKICAgICAgICAgICAgICAgIGRwW3VzZWQgKyBrXSA9IG1heChkcFt1c2VkICsga10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBbdXNlZF0gKyBiZXN0W2ldW2tdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyAzKSBBbnN3ZXIgaXMgZHBbbV0KICAgIGNvdXQgPDwgZHBbbV0gPDwgIlxuIjsKICAgIHJldHVybiAwOwp9Cg==