#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, k;
  cin >> n >> k;
  string s[n * k];
  pair<int, int> order[n * k];
  set<int> chars;
  for (int i = 0; i < n; i++) {
    int p;
    cin >> p;
    for (int j = 0; j < k; j++) {
      int idx = i * k + j;
      cin >> s[idx];
      if (chars.size() < 26)
        for (char c : s[idx]) chars.insert(c - 'a');
      order[idx] = {p, idx};
    }
  }
  sort(order, order + n * k);
  bool ok = true;
  set<int> G[30];
  for (int i = 1; i < n * k; i++) {
    string s1 = s[order[i - 1].second];
    string s2 = s[order[i].second];
    int s_len = min(s1.size(), s2.size());
    bool all_same = true;
    for (int j = 0; j < s_len; j++) {
      if (s1[j] == s2[j]) continue;
      G[s2[j] - 'a'].insert(s1[j] - 'a');
      all_same = false;
      break;
    }
    if (all_same && s1.size() > s2.size()) ok = false;
  }
  if (!ok) return cout << "IMPOSSIBLE\n", 0;
  string result;
  while (chars.size() > 0) {
    int nxt = -1;
    for (auto c : chars) {
      if (G[c].size() == 0) {
        nxt = c;
        break;
      }
    }
    if (nxt == -1) return cout << "IMPOSSIBLE\n", 0;
    result = result + char(nxt + 'a');
    for (int i = 0; i < 30; i++) G[i].erase(nxt);
    chars.erase(nxt);
  }
  cout << result << '\n';
}
