#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector")
using namespace std;
const int K = 2500 + 5;
inline void done(const string& s) {
  cout << s << '\n';
  exit(0);
}
bool flag;
set<int> hv;
string ss[K];
void maintain(int);
void get_pos(const string&, const string&, vector<int>&);
bool check(const string&, int);
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int k, n;
  cin >> k >> n;
  for (int i = 0; i < k; i++) cin >> ss[i];
  sort(ss, ss + k);
  maintain(k);
  vector<int> pos;
  for (int i = 1; i < k; i++) {
    get_pos(ss[0], ss[i], pos);
    if (((int)(pos).size())) break;
  }
  if (((int)(pos).size()) > 4) done("-1");
  if (!((int)(pos).size())) {
    swap(ss[0][0], ss[0][1]);
    done(ss[0]);
  }
  for (auto i : ss[0]) {
    flag |= (hv.find(i) != hv.end());
    hv.insert(i);
  }
  flag = !flag;
  string tmp = ss[0];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < ((int)(pos).size()); j++) {
      if (i == j) continue;
      swap(tmp[i], tmp[pos[j]]);
      if (check(tmp, k)) done(tmp);
      swap(tmp[i], tmp[pos[j]]);
    }
  }
  if (!flag and check(tmp, k)) done(tmp);
  cout << -1 << '\n';
  return 0;
}
void maintain(int n) {
  int cnt[26] = {0};
  for (auto c : ss[0]) cnt[c - 'a']++;
  for (int i = 1; i < n; i++) {
    int cnt1[26] = {0};
    for (auto c : ss[i]) cnt1[c - 'a']++;
    for (int j = 0; j < 26; j++)
      if (cnt[j] != cnt1[j]) {
        done("-1");
      }
  }
}
void get_pos(const string& a, const string& b, vector<int>& ret) {
  int n = ((int)(a).size());
  for (int i = 0; i < n; i++) {
    if (a[i] != b[i]) ret.push_back(i);
  }
}
bool check(const string& s, int n) {
  for (int i = 0; i < n; i++) {
    vector<int> cur;
    get_pos(s, ss[i], cur);
    if (((int)(cur).size()) > 2 or (flag and !((int)(cur).size())))
      return false;
  }
  return true;
}
