#include <bits/stdc++.h>
using namespace std;
long long power(long long b, long long e, long long m) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b % m, e / 2, m) % m;
  return power(b * b % m, e / 2, m);
}
long long power(long long b, long long e) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b, e / 2);
  return power(b * b, e / 2);
}
int used[26];
vector<string> v;
vector<vector<int>> adj;
int color[26];
vector<int> order;
void no() {
  cout << "IMPOSSIBLE";
  exit(0);
}
void dfs(int x) {
  color[x] = 1;
  for (auto i : adj[x]) {
    if (color[i] == 1) no();
    if (color[i] == 2) continue;
    dfs(i);
  }
  order.push_back(x);
  color[x] = 2;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  adj.resize(26);
  v.resize(n * k);
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    for (int j = 0; j < k; j++) {
      string ss;
      cin >> ss;
      v[x * k + j] = ss;
      for (auto l : ss) used[l - 'a'] = 1;
    }
  }
  bool zz = true;
  for (int i = 0; i < n * k - 1; i++) {
    zz = true;
    for (int j = 0; j < min(v[i].length(), v[i + 1].length()); j++) {
      if (v[i][j] == v[i + 1][j])
        continue;
      else {
        adj[v[i][j] - 'a'].push_back(v[i + 1][j] - 'a');
        zz = false;
        break;
      }
    }
    if (zz)
      if (v[i].size() > v[i + 1].size()) no();
  }
  for (int i = 0; i < 26; i++) {
    if (used[i] && color[i] != 2) dfs(i);
  }
  reverse(order.begin(), order.end());
  for (auto i : order) cout << char(i + 'a');
  return 0;
}
