#include<cstdio>
using namespace std;
int n,m,cnt,left[505],ans[505],tot[505];
struct unit{int w,s,a,d,r,c;}node[6000];
void init()
{
cnt=m;
for(int i=0;i<=m;i++)
node[i]={i,i,i-1,i+1,0,i};
node[m].d=0;
node[0].a=m;
}
void remove(int x)
{
node[node[x].a].d=node[x].d;
node[node[x].d].a=node[x].a;
for(int i=node[x].s;i!=x;i=node[i].s)
for(int j=node[i].d;j!=i;j=node[j].d)
{
node[node[j].w].s=node[j].s;
node[node[j].s].w=node[j].w;
tot[node[j].c]--;
}
}
void recover(int x)
{
for(int i=node[x].w;i!=x;i=node[i].w)
for(int j=node[i].d;j!=i;j=node[j].d)
{
node[node[j].w].s=node[node[j].s].w=j;
tot[node[j].c]++;
}
node[node[x].a].d=node[node[x].d].a=x;
}
bool dlx(int dep)
{
if(!node[0].d)
{
for(int i=1;i<dep;i++)
printf("%d ",ans[i]);
return true;
}
int C=node[0].d;
for(int i=node[C].d;i;i=node[i].d)
if(tot[i]<tot[C])
C=i;
if(node[C].s==C)
return false;
remove(C);
for(int i=node[C].s;i!=C;i=node[i].s)
{
ans[dep]=node[i].r;
for(int j=node[i].a;j!=i;j=node[j].a)
remove(node[j].c);
if(dlx(dep+1))
return true;
for(int j=node[i].d;j!=i;j=node[j].d)
recover(node[j].c);
}
recover(C);
return false;
}
int main()
{
freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;i++)
for(int j=1,a;j<=m;j++)
{
scanf("%d",&a);
if(a)
{
tot[j]++;
node[++cnt]={node[j].w,j,0,0,i,j};
node[node[j].w].s=cnt;
node[j].w=cnt;
if(!left[i])
left[i]=node[cnt].a=node[cnt].d=cnt;
else
{
node[cnt].d=left[i];
node[cnt].a=node[left[i]].a;
node[node[left[i]].a].d=cnt;
node[left[i]].a=cnt;
}
}
}
if(!dlx(1))
printf("No Solution!");
return 0;
}