#include <bits/stdc++.h>
using namespace std;
int n, m;
int val[103][103];
int memo[103][10003];
int tam[103];
int a[103];
int memo2[103][103][103];
int go(int pos, int quiero) {
  if (pos >= n) return 0;
  if (quiero <= 0) return 0;
  if (memo[pos][quiero] != -1) return memo[pos][quiero];
  int res = 0;
  for (int i = 0; i < tam[pos] + 1; i++) {
    if (i <= quiero) res = max(res, val[pos][i] + go(pos + 1, quiero - i));
  }
  return memo[pos][quiero] = res;
}
int go2(int ini, int fin, int pode) {
  if (pode <= 0) return 0;
  if (ini > fin) return 0;
  if (memo2[ini][fin][pode] != -1) return memo2[ini][fin][pode];
  int res = 0;
  res = max(res, a[ini] + go2(ini + 1, fin, pode - 1));
  res = max(res, a[fin] + go2(ini, fin - 1, pode - 1));
  return memo2[ini][fin][pode] = res;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &tam[i]);
    for (int j = 0; j < tam[i]; j++) scanf("%d", &a[j]);
    val[i][0] = 0;
    memset(memo2, -1, sizeof memo2);
    for (int k = 1; k < tam[i] + 1; k++) val[i][k] = go2(0, tam[i] - 1, k);
  }
  memset(memo, -1, sizeof memo);
  int res = go(0, m);
  cout << res << endl;
  return 0;
}
