#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 3;
bool in[113];
bool odw[113];
bool prze[113];
vector<int> v[113];
string tab[MAXN];
vector<char> ans;
bool por = false;
void DFS(int x) {
  prze[x] = true;
  odw[x] = true;
  for (auto it : v[x]) {
    if (prze[it])
      por = true;
    else if (!odw[it])
      DFS(it);
  }
  ans.push_back(char(x + 'a'));
  prze[x] = false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, k, p;
  bool check;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> p;
    for (int j = 0; j < k; j++) {
      cin >> tab[p * k + j];
      for (auto &it : tab[p * k + j]) in[it - 'a'] = true;
    }
  }
  for (int i = 1; i < n * k; i++) {
    check = false;
    for (unsigned int j = 0; j < min(tab[i].size(), tab[i - 1].size()); j++) {
      if (tab[i][j] != tab[i - 1][j]) {
        check = true;
        v[tab[i - 1][j] - 'a'].push_back(tab[i][j] - 'a');
        break;
      }
    }
    if (!check && tab[i - 1].size() > tab[i].size()) por = true;
  }
  for (int i = 0; i < 26; i++) {
    if (!odw[i] && in[i]) DFS(i);
  }
  if (por)
    cout << "IMPOSSIBLE";
  else {
    for (int i = (int)(ans.size()) - 1; i >= 0; i--) cout << ans[i];
  }
  return 0;
}
