#include<fstream.h>
long m,n,i,p,minmn,a[50][50],j,cate,min,q,w;
int minim(int x,int y){
if(x>y)
return y;
return x;
}
int umpd(int n,int m,int dul,int duc);
int umpj(int n,int m,int dul,int duc);
int main(){
ifstream fin("piese.in");
ofstream fout("piese.out");
fin>>q>>w;
minmn=minim(q,w);
p=1;
cate=1;
for(i=2;i*p<=minmn;p=p*i) ;
for(i=1;i<=p;i++)
for(j=1;j<=p;j++)
a[i][j]=1;
if(p<w)umpd(q,w-p,1,p+1);
else umpj(q-p,w,p+1,1);
fout<<a[q][w]<<'\n';
for(i=1;i<=q;i++){
for(j=1;j<=w;j++)
fout<<a[i][j]<<' ';
fout<<'\n';
}
return 0;
}
int umpj(int n,int m,int dul,int duc){
minmn=minim(n,m);
p=1;
cate++;
for(i=2;i*p<=minmn;p=p*i) ;
for(i=dul;i<p+dul;i++)
for(j=duc;j<p+duc;j++)
a[i][j]=cate;
umpd(n,m-p,dul,duc+p);
}
int umpd(int n,int m,int dul,int duc){
minmn=minim(n,m);
int i,j,p,l=0;
p=1;
cate++;
for(i=2;i*p<=minmn;p=p*i) ;
for(i=dul;i<p+dul;i++)
for(j=duc;j<p+duc;j++)
a[i][j]=cate;
if(i>q+1 || j>w+1)
return 0;
if(p+duc-1<w)
umpd(n,m-p,dul,duc+p);
else{
while(a[i][1]!=0) i++;
while(a[1][j]!=0) j++;
umpj(q-i+1,w,i,1);
}
}