#include <iostream>
using namespace std;
int res[110][110]; //全局变量初值默认为0
int main(){
int n,m;
cin>>n>>m;
//(x,y)+(dx[d],dy[d])
//(dx[d],dy[d])为四个方向的一个方向每走一步的偏移量
//d=(d+1)%4表示变换方向,按顺时针变
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
//当前坐标,初始时为(0,0)
int x=0,y=0;
//最开始向右填数组,为方向1
int d=1;
//一共填n*m个格子,即走n*m步,每一步填一个数字
for(int i=1;i<=n*m;i++){
res[x][y]=i; //填数字
int a=x+dx[d],b=y+dy[d]; //下一步要尝试填的坐标
if(a<0||a>=n||b<0||b>=m||res[a][b]!=0){
//如果撞墙,就要变方向,同时更新下一步要尝试填的坐标
//撞墙有两种情况:1.出界 2.走到已经填过的格子
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
for(int i=0;i<n;i++){
cout<<res[i][0];
for(int j=1;j<m;j++){
cout<<" "<<res[i][j];
}
cout<<endl;
}
return 0;
}