func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX = 111, K = 26;   int n;   string name[MAX];   namespace G {   struct V : vector<int> {     V() : odw(false) {}     bool odw;     int wyj;   };   V g[K];   void krawedz(char a, char b) {     g[int(a) - int( a )].push_back(int(b) - int( a ));   }   int t = 0;   stack<int> stos;   void dfs(int v) {     g[v].odw = true;     for (int i = 0; i < ((int((g[v]).size()))); i++) {       int u = g[v][i];       if (!g[u].odw) dfs(u);     }     stos.push(v);     g[v].wyj = t++;   }   bool poprawne_sortowanie() {     for (int v = 0; v < (K); v++)       for (int i = 0; i < ((int((g[v]).size()))); i++) {         int u = g[v][i];         if (g[v].wyj < g[u].wyj) return false;       }     return true;   }   bool sortowanie_topologiczne() {     for (int i = 0; i < (K); i++)       if (!g[i].odw) dfs(i);     return poprawne_sortowanie();   }   void wypisz_sortowanie() {     assert((int((stos).size())) == 26);     while (!stos.empty()) {       cout << char(int( a ) + stos.top());       stos.pop();     }     cout <<   n ;   }   }  // namespace G   void wczytaj_dane() {     cin >> n;     for (int i = 0; i < (n); i++) cin >> name[i];   }   int roznica(const string& a, const string& b) {     int m = min((int((a).size())), (int((b).size())));     for (int i = 0; i < (m); i++)       if (a[i] != b[i]) return i;     return -1;   }   bool porownuj(const string& a, const string& b) {     int i = roznica(a, b);     if (i == -1) return (int((a).size())) < (int((b).size()));     G::krawedz(a[i], b[i]);     return true;   }   void zrob_test() {     wczytaj_dane();     for (int i = 0; i < (n - 1); i++)       if (!porownuj(name[i], name[i + 1])) {         cout <<  Impossible n ;         return;       }     if (G::sortowanie_topologiczne())       G::wypisz_sortowanie();     else       cout <<  Impossible n ;   }   int main() {     ios_base::sync_with_stdio(0);     zrob_test();     return 0;   }   