func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mxN = 1e3 + 1;   int n, d[mxN], k;   vector<int> adj[mxN];   vector<string> a[mxN];   signed main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cin >> n >> k;     for (int i = 0, c; i < n; i++) {       cin >> c;       string s1;       for (int j = 0; j < k; j++) {         cin >> s1;         a[c].push_back(s1);       }     }     vector<string> s;     for (int i = 0; i < n; i++)       for (int j = 0; j < k; j++) s.push_back(a[i][j]);     n *= k;     vector<bool> ok(26);     int al = 0;     for (string x : s)       for (char c : x) {         if (!ok[c -  a ]) ++al, ok[c -  a ] = 1;       }     for (int i = 1; i < n; i++) {       int n1 = s[i - 1].size(), n2 = s[i].size(), i1 = 0;       for (; i1 < n1 || i1 < n2; i1++) {         if (i1 >= n2 && i1 < n1) {           cout <<  IMPOSSIBLE ;           return 0;         } else if (i1 >= n1 || i1 >= n2)           break;         if (s[i - 1][i1] == s[i][i1]) continue;         adj[s[i - 1][i1] -  a ].push_back(s[i][i1] -  a );         d[s[i][i1] -  a ]++;         break;       }     }     queue<int> qu;     string ans;     for (int i = 0; i < 26; i++)       if (!d[i] && ok[i]) qu.push(i);     while (qu.size()) {       int u = qu.front();       qu.pop();       for (int x : adj[u]) {         --d[x];         if (!d[x]) qu.push(x);       }       ans += (u +  a );     }     cout << (ans.size() == al ? ans :  IMPOSSIBLE );   }   