#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
int vis[26], cnt[26], h[26];
set<int> e[26];
vector<string> S[1005];
int mp[26];
bool operator<=(string a, string b) {
  for (int i = 0; i < min(a.size(), b.size()); i++) {
    if (a[i] == b[i]) continue;
    return mp[a[i] - 'a'] < mp[b[i] - 'a'];
  }
  return a.size() <= b.size();
}
int main() {
  ios_base::sync_with_stdio(false);
  string s;
  int n, k, p;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> p;
    for (int i = 1; i <= k; i++) {
      cin >> s, S[p].push_back(s);
      for (char c : s) h[c - 'a'] = 1;
    }
  }
  vector<string> v;
  for (int i = 0; i < n; i++)
    for (string s : S[i]) v.push_back(s);
  for (int i = 1; i < v.size(); i++) {
    string &s1 = v[i - 1], &s2 = v[i];
    for (int i = 0; i < min(s1.size(), s2.size()); i++) {
      if (s1[i] != s2[i]) {
        int c1 = s1[i] - 'a', c2 = s2[i] - 'a';
        if (e[c1].find(c2) == e[c1].end()) e[c1].insert(c2), cnt[c2]++;
        break;
      }
    }
  }
  vector<int> q;
  int m = 0;
  for (int i = 0; i < 26; i++) m += (h[i]);
  for (int i = 0; i < 26; i++)
    if (cnt[i] == 0 and h[i]) q.push_back(i);
  for (int k = 0; k < q.size(); k++) {
    int i = q[k];
    vis[i] = 1;
    for (int j : e[i]) {
      if (vis[j]) continue;
      cnt[j]--;
      if (cnt[j] == 0) q.push_back(j);
    }
  }
  bool ok = 1;
  for (int i = 0; i < q.size(); i++) mp[q[i]] = i;
  for (int i = 1; i < v.size(); i++) ok &= (v[i - 1] <= v[i]);
  if (q.size() != m or !ok) cout << "IMPOSSIBLE" << '\n', exit(0);
  for (int i : q) cout << (char)(i + 'a');
  return 0;
}
