#include <bits/stdc++.h>
using namespace std;
const int N = 1010, M = 110;
int graph[27][27], d[27], q[M], comp[M];
bool st[27] = {0};
bool flag, ifpos = true;
struct Page {
  int num;
  char str[N][M];
  bool operator<(const Page &other) const { return num < other.num; }
} page[N];
int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    scanf("%d", &page[i].num);
    for (int j = 0; j < k; j++) scanf("%s", page[i].str[j]);
  }
  sort(page, page + n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < k; j++) {
      flag = true;
      for (int t = 0; page[i].str[j][t] || comp[t]; t++) {
        int let = page[i].str[j][t] - 'a' + 1;
        if (page[i].str[j][t]) st[let] = true;
        if (comp[0]) {
          if ((comp[t] - 'a' + 1) != let) {
            if (!page[i].str[j][t] && flag) ifpos = false;
            if ((!graph[let][comp[t] - 'a' + 1]) && let && comp[t] && flag)
              graph[let][comp[t] - 'a' + 1] = 1, d[comp[t] - 'a' + 1]++;
            flag = false;
          }
        }
      }
      for (int u = 0; u < M; u++) comp[u] = page[i].str[j][u];
    }
  if (!ifpos)
    cout << "IMPOSSIBLE" << endl;
  else {
    int cnt = 0;
    for (int i = 1; i <= 26; i++)
      if (st[i]) cnt++;
    int hh = 0, tt = -1;
    for (int i = 1; i <= 26; i++)
      if ((!d[i]) && st[i]) q[++tt] = i;
    while (hh <= tt) {
      int t = q[hh++];
      for (int i = 1; i <= 26; i++) {
        if (graph[t][i]) d[i]--;
        if ((!d[i]) && graph[t][i] && st[i]) q[++tt] = i;
      }
    }
    if (tt == cnt - 1)
      for (int i = cnt - 1; i >= 0; i--) printf("%c", q[i] - 1 + 'a');
    else
      printf("IMPOSSIBLE");
  }
  return 0;
}
