#include <bits/stdc++.h>
using namespace std;
const int N = 105;
const int A = 26;
int n;
string s[N];
bool go[A][A];
int used[N];
bool found;
vector<int> topo;
void dfs_cycle(int v) {
  used[v] = 1;
  for (int i = 0; i < A; i++)
    if (go[v][i]) {
      if (used[i] == 1)
        found = true;
      else if (used[i] == 0)
        dfs_cycle(i);
    }
  used[v] = 2;
}
void dfs_topo(int v) {
  used[v] = 1;
  for (int i = 0; i < A; i++)
    if (go[v][i] && used[i] == 0) dfs_topo(i);
  topo.push_back(v);
}
void solve() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      int maxlen = (int)max(s[i].length(), s[j].length());
      for (int ind = 0; ind < maxlen; ind++) {
        char x = (ind < (int)s[i].length() ? s[i][ind] : ' ');
        char y = (ind < (int)s[j].length() ? s[j][ind] : ' ');
        if (x != y) {
          if (x != ' ' && y == ' ') {
            puts("Impossible");
            return;
          }
          if (x != ' ' && y != ' ') go[x - 'a'][y - 'a'] = true;
          break;
        }
      }
    }
  for (int i = 0; i < A; i++)
    if (used[i] == 0) dfs_cycle(i);
  if (found) {
    puts("Impossible");
    return;
  }
  memset(used, 0, sizeof(used));
  for (int i = 0; i < A; i++)
    if (used[i] == 0) dfs_topo(i);
  reverse(topo.begin(), topo.end());
  for (int i = 0; i < (int)topo.size(); i++) putchar(topo[i] + 'a');
  putchar('\n');
}
int main() {
  solve();
  0;
  return 0;
}
