#include <bits/stdc++.h>
using namespace std;

int main() {
  int n,m,t;
  cin >> n >> m;
  vector<char> str;
  for(int i=0; i<m; i++) {
    string s;
    cin >> s;
    if(i == 0) t = s.size();
    for(int j=0; j<s.size(); j++) str.push_back(s.at(j));
  }
  
  for(int i=0; i<n; i++) {
    for(int j=0; j<n; j++) {
      cout << str.at(i*20 + j + t);
    }
    cout << endl;
  }
  return 0;
}
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<n; i++)
#define rng(i,l,r) for (int i=l; i<r; i++)
#define V(t) vector<t>
#define VV(t) V(vector<t>)
using namespace std;
using ll = long long;
using P = pair<int,int>;
const int INF = 1 << 30;
template<class T> bool chmin(T& a, T b){ if (a > b){ a = b; return true; } return false; }
template<class T> bool chmax(T& a, T b){ if (a < b){ a = b; return true; } return false; }

int main() {
   int N, M; cin >> N >> M;
   bool ok = false;
   vector<P> res;

   if (M >= 0) {
      int s = 1;
      res.push_back(make_pair(s, s+(M+1)*2+1));
      N--;
      // Mの差を作る
      if (M > 0) {
         rep(i, M+1) {
            s++;
            N--;
            res.push_back(make_pair(s, s+1));
            s++;
         }
      } else {
         s+=(M+1)*2+1;
      }
      ok = N >= 0;
      // 埋める
      s++;
      while (N > 0) {
         s++;
         N--;
         res.push_back(make_pair(s, s+1));
         s++;
      }
   }

   if (ok) {
      for (auto p : res) {
         cout << p.first << " " << p.second << endl;
      }
   } else {
      cout << -1 << endl;
   }
}
