using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray(); static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (h, w) = (c[0], c[1]); if (h > w) { var ac = CreateC(w, h); var at = CreateT(w, h); var act = CreateCT(w, h); if (ac.k > 0) { WriteLine(ac.k); WriteLine(string.Join("\n", Rotate(ac.a).Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); if (at.k > 0) { WriteLine(at.k); WriteLine(string.Join("\n", Rotate(at.a).Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); if (act.k > 0) { WriteLine(act.k); WriteLine(string.Join("\n", Rotate(act.a).Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); } else { var ac = CreateC(h, w); var at = CreateT(h, w); var act = CreateCT(h, w); if (ac.k > 0) { WriteLine(ac.k); WriteLine(string.Join("\n", ac.a.Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); if (at.k > 0) { WriteLine(at.k); WriteLine(string.Join("\n", at.a.Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); if (act.k > 0) { WriteLine(act.k); WriteLine(string.Join("\n", act.a.Select(ri => string.Join(" ", ri)))); } else WriteLine(-1); } } static (int k, int[][] a) CreateC(int h, int w) { var k = 0; var a = new int[h][]; for (var i = 0; i < h; ++i) a[i] = new int[w]; if (h == 3) { if (w >= 4 && w % 2 == 0) { var d = 0; if (w % 4 != 0) { for (var i = 0; i < 3; ++i) for (var j = 0; j < 6; ++j) a[i][j] = m36[i][j]; k += 3; d += 6; } while (d < w) { for (var i = 0; i < 3; ++i) for (var j = 0; j < 4; ++j) a[i][d + j] = m34[i][j] + k; k += 2; d += 4; } return (k, a); } } if (h >= 4) { var l = 0; var r = 0; var t = 0; var b = 0; while (h - t - b > 4) { if (h - t - b >= w - l - r) { for (var j = l; j < w - r; ++j) { a[t][j] = k + 1; a[h - b - 1][j] = k + 1; } for (var i = t + 1; i < h - b; ++i) a[i][l] = k + 1; ++t; ++b; ++l; } else { for (var i = t; i < h - b; ++i) { a[i][l] = k + 1; a[i][w - r - 1] = k + 1; } for (var j = l; j < w - r; ++j) a[h - b - 1][j] = k + 1; ++l; ++r; ++b; } ++k; } if (h - t - b == 3) { for (var i = 0; i < 3; ++i) for (var j = 0; j < 4; ++j) a[t + i][l + j] = m34[i][j] + k; k += 2; } else { for (var j = l; j < w - r; ++j) { a[t][j] = k + 1; a[t + 1][j] = k + 2; a[t + 2][j] = k + 1; a[t + 3][j] = k + 2; } a[t + 1][w - r - 1] = k + 1; a[t + 2][l] = k + 2; k += 2; } return (k, a); } return False; } static int[][] m34 = new int[][] { new int[] { 1, 1, 1, 2 }, new int[] { 1, 2, 1, 2 }, new int[] { 1, 2, 2, 2 } }; static int[][] m36 = new int[][] { new int[] { 1, 1, 1, 3, 3, 3 }, new int[] { 1, 2, 1, 3, 2, 3 }, new int[] { 1, 2, 2, 2, 2, 3 } }; static int[][] t36 = new int[][] { new int[] { 1, 2, 2, 2, 2, 4 }, new int[] { 1, 1, 2, 3, 4, 4 }, new int[] { 1, 3, 3, 3, 3, 4 } }; static int[][] t44 = new int[][] { new int[] { 1, 2, 2, 2 }, new int[] { 1, 1, 2, 3 }, new int[] { 1, 4, 3, 3 }, new int[] { 4, 4, 4, 3 } }; static int[][] t45 = new int[][] { new int[] { 1, 2, 2, 2, 2 }, new int[] { 1, 1, 1, 2, 3 }, new int[] { 1, 4, 3, 3, 3 }, new int[] { 4, 4, 4, 4, 3 } }; static int[][] t55 = new int[][] { new int[] { 1, 1, 1, 1, 1 }, new int[] { 2, 2, 2, 1, 3 }, new int[] { 4, 2, 3, 3, 3 }, new int[] { 4, 4, 4, 5, 3 }, new int[] { 4, 5, 5, 5, 5 } }; static (int k, int[][] a) CreateT(int h, int w) { var k = 0; var a = new int[h][]; for (var i = 0; i < h; ++i) a[i] = new int[w]; if (h == 2) return False; if (h == 3) { if (w >= 6) { for (var i = 0; i < h; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = t36[i][5]; else a[i][j] = t36[i][Math.Min(4, j)]; } return (4, a); } } else if (h == 4) { if (w == 4) { for (var i = 0; i < h; ++i) for (var j = 0; j < w; ++j) a[i][j] = t44[i][j]; } else { for (var i = 0; i < h; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = t45[i][4]; else if (j + 2 == w) a[i][j] = t45[i][3]; else a[i][j] = t45[i][Math.Min(2, j)]; } } return (4, a); } else if (h == 5) { for (var i = 0; i < h; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = t55[i][4]; else if (j + 2 == w) a[i][j] = t55[i][3]; else a[i][j] = t55[i][Math.Min(2, j)]; } return (5, a); } else { var d = 0; if (h % 3 == 1) { for (var i = 0; i < 4; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = t45[i][4]; else if (j + 2 == w) a[i][j] = t45[i][3]; else a[i][j] = t45[i][Math.Min(2, j)]; } k += 4; d += 4; } else if (h % 3 == 2) { for (var i = 0; i < 5; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = t55[i][4]; else if (j + 2 == w) a[i][j] = t55[i][3]; else a[i][j] = t55[i][Math.Min(2, j)]; } k += 5; d += 5; } while (d < h) { for (var i = 0; i < 3; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i + d][j] = t36[i][5] + k; else a[i + d][j] = t36[i][Math.Min(4, j)] + k; } k += 4; d += 3; } return (k, a); } return False; } static int[][] tc33 = new int[][] { new int[] { 1, 2, 2 }, new int[] { 1, 1, 2 }, new int[] { 1, 2, 2 } }; static int[][] tc44 = new int[][] { new int[] { 1, 2, 2, 2 }, new int[] { 1, 1, 1, 2 }, new int[] { 1, 3, 2, 2 }, new int[] { 3, 3, 3, 3 } }; static int[][] tc55 = new int[][] { new int[] { 1, 1, 1, 1, 1 }, new int[] { 1, 2, 3, 3, 3 }, new int[] { 1, 2, 2, 2, 3 }, new int[] { 1, 2, 3, 3, 3 }, new int[] { 1, 1, 1, 1, 1 } }; static (int k, int[][] a) CreateCT(int h, int w) { var k = 0; var a = new int[h][]; for (var i = 0; i < h; ++i) a[i] = new int[w]; if (h == 2) return False; var d = 0; if (h % 3 == 1) { for (var i = 0; i < 4; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = tc44[i][3]; else a[i][j] = tc44[i][Math.Min(2, j)]; } k += 3; d += 4; } else if (h % 3 == 2) { for (var i = 0; i < 5; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i][j] = tc55[i][4]; else a[i][j] = tc55[i][Math.Min(3, j)]; } k += 3; d += 5; } while (d < h) { for (var i = 0; i < 3; ++i) for (var j = 0; j < w; ++j) { if (j + 1 == w) a[i + d][j] = tc33[i][2] + k; else a[i + d][j] = tc33[i][Math.Min(1, j)] + k; } k += 2; d += 3; } return (k, a); } static (int k, int[][] a) False = (0, new int[0][]); static int[][] Rotate(int[][] a) { var ans = new int[a[0].Length][]; for (var i = 0; i < ans.Length; ++i) ans[i] = new int[a.Length]; for (var i = 0; i < a.Length; ++i) for (var j = 0; j < a[i].Length; ++j) ans[j][a.Length - i - 1] = a[i][j]; return ans; } }