#include <bits/stdc++.h>
long long mpow(long long a, long long n, long long mod) {
  long long ret = 1;
  long long b = a;
  while (n) {
    if (n & 1) ret = (ret * b) % mod;
    b = (b * b) % mod;
    n >>= 1;
  }
  return (long long)ret;
}
using namespace std;
vector<string> v;
bool graph[27][27] = {false}, vis[26];
vector<int> edges[26];
int main() {
  string s1;
  int i, j, m;
  int n;
  scanf("%d", &n);
  ;
  for (j = 0; j < n; j++) {
    cin >> s1;
    v.push_back(s1);
  }
  for (i = 0; i < n; i++)
    for (j = i + 1; j < n; j++) {
      int k = min(v[i].size(), v[j].size()), l, pos = -1;
      for (l = 0; l < k; l++) {
        if (v[i][l] != v[j][l]) {
          pos = l;
          break;
        }
      }
      if (pos == -1) {
        if (v[i].size() > v[j].size()) {
          cout << "Impossible";
          return 0;
        } else
          continue;
      }
      graph[v[i][l] - 'a'][v[j][l] - 'a'] = true;
    }
  for (m = 0; m < 26; m++)
    for (i = 0; i < 26; i++)
      for (j = 0; j < 26; j++) {
        if (graph[i][m] && graph[m][j]) graph[i][j] = true;
      }
  for (i = 0; i < 26; i++) {
    if (graph[i][i]) {
      cout << "Impossible";
      return 0;
    }
  }
  int indeg[26];
  vector<int> v;
  memset(indeg, 0, sizeof(indeg));
  for (i = 0; i < 26; i++)
    for (j = 0; j < 26; j++) indeg[j] += graph[i][j];
  string ans;
  for (i = 0; i < 26; i++)
    if (!indeg[i]) v.push_back(i);
  while (!v.empty()) {
    int temp = v.back();
    v.pop_back();
    ans += (temp + 'a');
    for (i = 0; i < 26; i++) {
      if (graph[temp][i]) {
        indeg[i]--;
        if (!indeg[i]) v.push_back(i);
      }
    }
  }
  if (ans.size() < 26)
    cout << "Impossible";
  else
    cout << ans;
  return 0;
}
