#include using namespace std; const int oo = 0x3f3f3f3f; const double eps = 1e-9; const double PI = 2.0 * acos(0.0); typedef long long ll; typedef unsigned long long ull; typedef pair pii; typedef vector vi; typedef vector vs; #define sz(c) int((c).size()) #define all(c) (c).begin(), (c).end() #define FOR(i,a,b) for (int i = (a); i < (b); i++) #define FORS(i,a,b,s) for (int i = (a); i < (b); i=i+(s)) #define FORD(i,a,b) for (int i = int(b)-1; i >= (a); i--) #define FORIT(i,c) for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); i++) #define MAXN 26 vi adj[MAXN]; // input: adjacency list int p, v[MAXN]; // temp: node color int fg; // output: cycle found (0/1) int od[MAXN]; // output: nodes in order void dfs(int a) { if(v[a]==1) fg = 1; if(v[a]) return; v[a] = 1; // gray FOR(i,0,sz(adj[a])) dfs(adj[a][i]); v[a] = 2; // black od[p] = a; p--; } void topsort(int n) { FOR(i,0,n) v[i]=0; //white fg=0; p=n-1; FOR(i,0,n) if(!v[i]) dfs(i); } int main(){ int n; cin >> n; string cur = ""; bool inval = false; FOR(i,0,n){ string next; cin >> next; int diffPos = -1; FOR(j,0,min(sz(next), sz(cur))){ if (next[j] != cur[j]) { diffPos = j; break; } } if (diffPos == -1){ if (sz(next) < sz(cur)) inval = true; } else { adj[next[diffPos] - 'a'].push_back(cur[diffPos] - 'a'); } cur = next; } topsort(26); if (fg || inval) cout << "impossible" << endl; else { FORD(i,0,26) cout << char('a' + od[i]); cout << endl; } }