#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<int> num[100];
void get_data() {
  scanf("%d%d", &N, &M);
  int i, t, n;
  for (i = 0; i < N; i++) {
    scanf("%d", &t);
    while (t--) {
      scanf("%d", &n);
      num[i].push_back(n);
    }
  }
}
int maxv[100][101], sum[100];
void get_maxv() {
  int i, j, l, best, temp;
  for (i = 0; i < N; i++) {
    sum[i] = 0;
    for (j = 0; j < num[i].size(); j++) sum[i] += num[i][j];
  }
  for (i = 0; i < N; i++) {
    maxv[i][num[i].size()] = sum[i];
    maxv[i][0] = 0;
    for (l = 1; l < num[i].size(); l++) {
      best = 0;
      for (j = 0; j < l; j++) best += num[i][j];
      temp = best;
      for (; j < num[i].size(); j++) {
        temp += num[i][j] - num[i][j - l];
        if (temp < best) best = temp;
      }
      maxv[i][num[i].size() - l] = sum[i] - best;
    }
  }
}
int dp[100][10001];
int f_max(int x, int y) { return x > y ? x : y; }
void run() {
  get_maxv();
  memset(dp, -1, sizeof(dp));
  int i, j, k;
  for (j = 0; j <= num[0].size(); j++) {
    dp[0][j] = maxv[0][j];
  }
  for (i = 1; i < N; i++) {
    for (j = 0; j <= num[i].size(); j++) {
      for (k = M - j; k >= 0; k--) {
        if (dp[i - 1][k] == -1) continue;
        dp[i][k + j] = f_max(dp[i][k + j], dp[i - 1][k] + maxv[i][j]);
      }
    }
  }
  printf("%d\n", dp[N - 1][M]);
}
int main() {
  get_data();
  run();
  return 0;
}
