#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
using namespace std;
/*
题意:
想法:分组背包,01背包转化内层多一层循环,用来计算在k天得情况下的花费。
分组背包的意义在于是否选本组的某一个或者一件都不选。
*/
int dp[1009];
int ma[1009][1009];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
memset(dp,0,sizeof(dp));
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
scanf("%d",&ma[i][j]);
}
}
for(int i = 1;i<=n;i++)//选第i种
{
for(int j = m;j>=0;j--)
{
for(int k = 1;k<=j;k++)
{
dp[j] = max(dp[j],dp[j - k] + ma[i][k]);
}
}
}
printf("%d\n",dp[m]);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
using namespace std;
/*
题意:
想法:分组背包,01背包转化内层多一层循环,用来计算在k天得情况下的花费。
分组背包的意义在于是否选本组的某一个或者一件都不选。
*/
int dp[1009];
int ma[1009][1009];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
memset(dp,0,sizeof(dp));
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
scanf("%d",&ma[i][j]);
}
}
for(int i = 1;i<=n;i++)//选第i种
{
for(int j = m;j>=0;j--)
{
for(int k = 1;k<=j;k++)
{
dp[j] = max(dp[j],dp[j - k] + ma[i][k]);
}
}
}
printf("%d\n",dp[m]);
}
return 0;
}