#include <bits/stdc++.h>
using namespace std;
int n, k;
const int dydis = 1e3 + 10;
bool comesEarlier[26][26] = {0};
vector<string> pusl[dydis];
vector<string> mas;
bool galima = 1;
bool is[26];
void sulygink(int a, int b) {
  string A = mas[a], B = mas[b];
  bool did = 0;
  for (int i = 0; i < min(A.size(), B.size()); i++) {
    if (A[i] == B[i]) {
      continue;
    } else {
      comesEarlier[(A[i] - 'a')][(B[i] - 'a')] = 1;
      did = 1;
      break;
    }
  }
  if (!did) {
    if (A.size() <= B.size()) return;
    galima = 0;
  }
}
int inc[26] = {0};
vector<int> tops() {
  for (int i = 0; i < 26; i++) {
    for (int j = 0; j < 26; j++) {
      if (comesEarlier[i][j]) inc[j]++;
    }
  }
  vector<int> ret;
  for (int i = 0; i < 26; i++) {
    bool fd = 0;
    for (int j = 0; j < 26; j++) {
      if (inc[j] == 0) {
        ret.push_back(j);
        fd = 1;
        for (int h = 0; h < 26; h++) {
          if (comesEarlier[j][h]) inc[h]--;
        }
        inc[j] = -1;
        break;
      }
    }
    if (!fd) galima = 0;
  }
  return ret;
}
int main() {
  cin.tie(NULL);
  ios_base::sync_with_stdio(false);
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    int ind;
    cin >> ind;
    vector<string> vec;
    vec.resize(k);
    for (int j = 0; j < k; j++) cin >> vec[j];
    pusl[ind] = vec;
  }
  for (int i = 0; i < dydis; i++) {
    for (auto x : pusl[i]) mas.push_back(x);
  }
  for (int i = 1; i < mas.size(); i++) {
    sulygink(i - 1, i);
  }
  for (auto x : mas) {
    for (auto y : x) is[(y - 'a')] = 1;
  }
  vector<int> ans = tops();
  if (!galima) {
    cout << "IMPOSSIBLE";
    return 0;
  }
  for (auto x : ans) {
    if (is[x]) cout << ((char)(x + 'a'));
  }
  return 0;
}
