//这个题,吴同学让我深深明白了if  else  的差别,尤其是在动规里面
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105;
const int INF=0x3f3f3f3f;
int f,v,dp[maxn][maxn],a[maxn][maxn];
bool b[maxn][maxn];
void shuchu(int x,int y)
{
	if(x==0) return;
	if(b[x][y]==0) shuchu(x,y-1);
	if(b[x][y]==1) {shuchu(x-1,y-1);printf("%d ",y);}		
}
int main()
{
	freopen("hana.in","r",stdin);
	freopen("hana.out","w",stdout);
	//还需要记录方案数 
	scanf("%d%d",&f,&v);
	for(int i=1;i<=f;i++)
		for(int j=1;j<=v;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=f;i++)  
		for(int j=0;j<=v;j++)  
			dp[i][j] =-INF;	//边界的设置有问题		
	for(int i=1;i<=f;i++)
		for(int j=i;j<=v;j++) 
		//分为放和不放两种情况
		{
			if(dp[i][j-1]>=dp[i-1][j-1]+a[i][j]) {dp[i][j]=dp[i][j-1];}
			else
			{
				dp[i][j]=dp[i-1][j-1]+a[i][j];
				b[i][j]=true;//标识这条路是走过的 
			}
		}
	printf("%d\n",dp[f][v]);
	shuchu(f,v);		
}