#include <bits/stdc++.h>
using namespace std;
template <class T>
T gcd(T a, T b) {
  return a == 0 ? b : gcd(b % a, a);
}
template <class T>
string tostring(T a) {
  ostringstream os;
  os << a;
  return os.str();
}
int toint(string a) {
  istringstream is(a);
  int p;
  is >> p;
  return p;
}
long long toll(string a) {
  istringstream is(a);
  long long p;
  is >> p;
  return p;
}
int main() {
  int m, n;
  cin >> m >> n;
  vector<vector<int> > v;
  bool sw = false;
  if (m > n) swap(m, n), sw = true;
  if (m == 1 && n == 1) {
    puts("1");
    return 0;
  }
  if (m == 2 && n == 2 || m == 1 && n < 4) {
    cout << -1 << endl;
    return 0;
  }
  int k = 1;
  v.resize(m, vector<int>(n, 0));
  for (int i = 0; i < m; i++) {
    for (int j = i % 2; j < n; j += 2) {
      v[i][j] = k++;
    }
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      if (v[i][j] == 0) v[i][j] = k++;
    }
  }
  if (m == 2 && n == 3) {
    v[0][0] = 4;
    v[1][0] = 2;
    v[0][1] = 1;
    v[1][1] = 6;
    v[0][2] = 5;
    v[1][2] = 3;
  }
  if (m == 1 && n == 4) {
    v[0][0] = 2;
    v[0][1] = 4;
    v[0][2] = 1;
    v[0][3] = 3;
  }
  if (!sw)
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) cout << v[i][j] << (j == n - 1 ? "\n" : " ");
    }
  else {
    for (int j = 0; j < n; j++)
      for (int i = 0; i < m; i++) cout << v[i][j] << (i == m - 1 ? "\n" : " ");
  }
}
