#include <bits/stdc++.h>
using namespace std;
long long n, m, k1, f, used[300], viss[300], vis[300];
string s[110];
vector<int> g[200];
string ans;
void topo(int u) {
  vis[u] = 1;
  for (int i = 0; i < g[u].size(); i++)
    if (!vis[g[u][i]]) topo(g[u][i]);
  ans.push_back(u + 'a');
}
bool cyclic(int u) {
  if (used[u]) {
    return true;
  }
  if (viss[u]) return false;
  viss[u] = 1;
  used[u] = 1;
  for (int i = 0; i < g[u].size(); i++) {
    if (cyclic(g[u][i])) return true;
  }
  used[u] = 0;
  return false;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  for (int i = 0; i < n - 1; i++) {
    int flag = 0;
    for (int j = 0; j < s[i].size() && j < s[i + 1].size(); j++) {
      if (s[i][j] != s[i + 1][j]) {
        g[s[i][j] - 'a'].push_back(s[i + 1][j] - 'a');
        flag = 1;
        break;
      }
    }
    if (!flag && s[i].size() > s[i + 1].size()) {
      cout << "Impossible";
      return 0;
    }
  }
  for (int i = 0; i <= 25; i++) {
    if (viss[i] == 0) {
      if (cyclic(i)) {
        cout << "Impossible";
        return 0;
      }
    }
  }
  for (int i = 0; i <= 25; i++) {
    if (vis[i] == 0) {
      topo(i);
    }
  }
  reverse(ans.begin(), ans.end());
  cout << ans;
  return 0;
}
