func_code_string: #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;   }   