#include <bits/stdc++.h>
using namespace std;
vector<pair<int, string> > vec;
vector<int> G[30];
int du[30];
bool vis[30];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    int p;
    cin >> p;
    for (int j = 0; j < k; ++j) {
      string s;
      cin >> s;
      for (auto k : s) vis[k - 'a'] = 1;
      vec.push_back(make_pair(p * k + j, s));
    }
  }
  bool isok = true;
  sort(vec.begin(), vec.end());
  for (int i = 1; i < vec.size(); ++i) {
    string s1 = vec[i - 1].second;
    string s2 = vec[i].second;
    int j = 0, k = 0;
    for (j = 0, k = 0; j < s1.size() && k < s2.size(); ++j, ++k) {
      if (s1[j] != s2[k]) {
        break;
      }
    }
    if (j < s1.size() && k < s2.size() && s1[j] != s2[k]) {
      G[s1[j] - 'a'].push_back(s2[k] - 'a');
      du[s2[k] - 'a']++;
    } else {
      if (s1.size() > s2.size()) {
        isok = false;
      }
    }
  }
  queue<int> q;
  vector<char> ans;
  for (int i = 0; i < 26; ++i) {
    if (!du[i] && vis[i]) {
      q.push(i);
    }
  }
  while (!q.empty()) {
    int c = q.front();
    char p = c + 'a';
    q.pop();
    ans.push_back(p);
    for (auto i : G[c]) {
      du[i]--;
      if (!du[i]) q.push(i);
    }
  }
  for (int i = 0; i < 26; ++i)
    if (vis[i] && du[i]) {
      isok = false;
    }
  if (isok) {
    for (auto i : ans) cout << i;
    cout << endl;
  } else
    cout << "IMPOSSIBLE" << endl;
  return 0;
}
