#include <bits/stdc++.h>
using namespace std;
string s1, s2;
int rel[30][30], vis[30], temp[30];
stack<int> ans;
int flow;
bool flag = false;
void dfsb(int t) {
  vis[t] = 1;
  for (int i = 0; i < 26; i++) {
    if (flag) return;
    if (rel[t][i]) {
      if (flow == i) {
        flag = true;
        return;
      } else if (vis[i] == 0)
        dfsb(i);
    }
  }
}
void dfs(int t) {
  vis[t] = 1;
  for (int i = 0; i < 26; i++) {
    if (rel[t][i] && vis[i] == 0) {
      dfs(i);
    }
  }
  ans.push(t);
}
int main() {
  int n;
  cin >> n;
  cin >> s1;
  for (int i = 1; i < n; i++) {
    cin >> s2;
    int len = min(s1.length(), s2.length());
    bool tt = false;
    for (int j = 0; j < len; j++) {
      if (s1[j] != s2[j]) {
        rel[s1[j] - 'a'][s2[j] - 'a'] = 1;
        tt = true;
        break;
      }
    }
    if (!tt && s1.length() > s2.length()) flag = true;
    s1 = s2;
  }
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < 26; i++) {
    flow = i;
    dfsb(i);
    if (flag == true) break;
  }
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < 26; i++) {
    if (flag) break;
    if (vis[i] == 0) dfs(i);
  }
  if (flag)
    cout << "Impossible";
  else
    for (int i = 25; i >= 0; i--) {
      printf("%c", ans.top() + 'a');
      ans.pop();
    }
  cout << endl;
  return 0;
}
