#include <bits/stdc++.h>
using namespace std;
void read(int a[], int n) {
  for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
}
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
const long long MOD = 1000 * 1000 * 1000 + 7;
const long long MX = 10 * 1000 * 1000 + 7;
const int N = 1 * 1000 + 10;
int a[N];
int n, k;
int dp[N][61];
char s[N * N][200];
int len[N * N];
const string imp = "IMPOSSIBLE";
bool m[200][200];
bool has[200];
bool vis[200];
vector<char> st;
void dfs(char u) {
  vis[u] = true;
  for (char c = 'a'; c <= 'z'; ++c) {
    if (m[u][c] && !vis[c]) dfs(c);
  }
  st.push_back(u);
}
void solve_case() {
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    int p;
    cin >> p;
    for (int j = 0; j < k; ++j) {
      int ind = (p)*k + j;
      scanf("%s", &s[ind]);
      len[ind] = strlen(s[ind]);
      for (int q = 0; q < strlen(s[ind]); ++q) has[s[ind][q]] = true;
    }
  }
  int t = n * k;
  for (int i = 0; i < t - 1; ++i) {
    int l1 = len[i];
    int l2 = len[i + 1];
    int j = 0;
    while (j < l1 && j < l2) {
      if (s[i][j] == s[i + 1][j])
        j++;
      else
        break;
    }
    if (j == l1 || j == l2) {
      if (l1 > l2) {
        cout << imp;
        return;
      }
    } else {
      char lesser = s[i][j];
      char greater = s[i + 1][j];
      if (m[greater][lesser]) {
        cout << imp;
        return;
      }
      m[lesser][greater] = true;
    }
  }
  for (char c = 'a'; c <= 'z'; ++c)
    if (has[c]) {
      if (!vis[c]) {
        dfs(c);
      }
    }
  int pos[200] = {};
  reverse(st.begin(), st.end());
  for (int i = 0; i < st.size(); ++i) pos[st[i]] = i;
  for (char c = 'a'; c <= 'z'; ++c)
    for (char c1 = 'a'; c1 <= 'z'; ++c1) {
      if (m[c][c1] && pos[c] > pos[c1]) {
        cout << imp;
        return;
      }
    }
  for (int i = 0; i < st.size(); ++i) cout << st[i];
  cout << endl;
}
void prepare() {}
int main() {
  int T = 1;
  prepare();
  for (int tc = 1; tc <= T; tc++) solve_case();
  return 0;
}
