#include <bits/stdc++.h>   using namespace std;   long long INF = 1LL << 60;   long long MOD = 1e9 + 7;   namespace output {   void pr(short x) { cout << x; }   void pr(signed x) { cout << x; }   void pr(long x) { cout << x; }   void pr(long long x) { cout << x; }   void pr(unsigned short x) { cout << x; }   void pr(unsigned x) { cout << x; }   void pr(unsigned long x) { cout << x; }   void pr(unsigned long long x) { cout << x; }   void pr(float x) { cout << x; }   void pr(double x) { cout << x; }   void pr(long double x) { cout << x; }   void pr(char x) { cout << x; }   void pr(const char* x) { cout << x; }   void pr(const string& x) { cout << x; }   void pr(bool x) { cout << x; }   template <size_t sz>   void pr(const bitset<sz>& x) {     cout << x;   }   template <class T>   void pr(const complex<T>& x) {     cout << x;   }   template <class T1, class T2>   void pr(const pair<T1, T2>& x);   template <class T1, class T2, class T3>   void pr(const tuple<T1, T2, T3>& x);   template <class T>   void pr(const T& x);   template <class T, class... Ts>   void pr(const T& t, const Ts&... ts) {     pr(t);     pr(ts...);   }   template <class T1, class T2>   void pr(const pair<T1, T2>& x) {     pr( ( , x.first,  ,  , x.second,  ) );   }   template <class T1, class T2, class T3>   void pr(const tuple<T1, T2, T3>& x) {     pr( ( , get<0>(x),  ,  , get<1>(x),  ,  , get<2>(x),  ) );   }   template <class T>   void pr(const T& x) {     pr( [ );     bool fst = 1;     for (const auto& a : x) pr(!fst ?  ,   :   , a), fst = 0;     pr( ] );   }   void print() { pr(  n ); }   template <class T, class... Ts>   void print(const T& t, const Ts&... ts) {     pr(t);     if (sizeof...(ts)) pr(   );     print(ts...);   }   }  // namespace output   using namespace output;   template <class T1, class T2>   istream& operator>>(istream& is, pair<T1, T2>& x) {     is >> x.first >> x.second;     return is;   }   template <class T1, class T2, class T3>   istream& operator>>(istream& is, tuple<T1, T2, T3>& x) {     is >> get<0>(x) >> get<1>(x) >> get<2>(x);     return is;   }   template <class T>   istream& operator>>(istream& is, vector<T>& v) {     for (auto& x : v) is >> x;     return is;   }   long long powa(long long base, long long exp) {     long long res = 1;     while (exp) {       if (exp & 1) res = res * base % MOD;       base = base * base % MOD;       exp >>= 1;     }     return res;   }   bool mini(long long& a, long long b) { return b < a ? a = b, 1 : 0; }   bool maxi(long long& a, long long b) { return b > a ? a = b, 1 : 0; }   signed main() {     ios::sync_with_stdio(0), cin.tie(0);     vector<vector<long long> > silly = {{1, 2, 4}, {5, 3, 8}, {9, 6, 7}};     long long n;     cin >> n;     if (n <= 2)       print(-1);     else {       vector<vector<long long> > grid(n, vector<long long>(n));       long long cnt = 1;       bool vert = false;       for (long long(i) = (n - 1); (i) > (2); --(i)) {         if (!vert) {           for (long long(j) = (0); (j) < (i + 1); ++(j)) grid[i][j] = cnt++;           for (long long(j) = (i - 1); (j) > (-1); --(j)) grid[j][i] = cnt++;         } else {           for (long long(j) = (0); (j) < (i + 1); ++(j)) grid[j][i] = cnt++;           for (long long(j) = (i - 1); (j) > (-1); --(j)) grid[i][j] = cnt++;         }         vert = !vert;       }       for (long long(i) = (0); (i) < (3); ++(i))         for (long long(j) = (0); (j) < (3); ++(j))           grid[i][j] = silly[i][j] + cnt - 1;       for (long long(i) = (0); (i) < (n); ++(i)) {         for (long long(j) = (0); (j) < (n); ++(j)) cout << grid[i][j] <<    ;         cout <<   n ;       }     }   }