#include <bits/stdc++.h>
using namespace std;
const int N=1e2+5;
int n,v,a[N][N];
int f[N][N],pre[N][N];
int ans;
void print(int n,int m) {
if(n==0)
return ;
print(n-1,pre[n][m]); //递归调用
cout<<m<<' ';
}
int main() {
memset(f,0xc0,sizeof(f)); //求最大值,初值赋最小值
cin>>n>>v;
for(int i=1;i<=n;i++)
for(int j=1;j<=v;j++)
cin>>a[i][j];
for(int i=0;i<=v;i++) //第0行所有数字要赋0
f[0][i]=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=v-n+i;j++) //一个数i前面i-1个数至少也用到了i-1位,所以从i位开始枚举,还要给后面的数留位置,也就是枚举到v-n+i结束
for(int k=i-1;k<=j-1;k++) { //此处也是看之前的可行状态
if(f[i-1][k]+a[i][j]>f[i][j]) {
f[i][j]=f[i-1][k]+a[i][j];
pre[i][j]=k; //记录路径
}
}
for(int i=n;i<=v;i++) //最底下的点哪个最大,哪个就是解
if(f[n][ans]<f[n][i])
ans=i; //更新解,注意这里解是一个下标,为了方便之后的输出路径
cout<<f[n][ans]<<endl;
print(n,ans); //输出路径
return 0;
}