#include <bits/stdc++.h>
using namespace std;
int n;
string s[105];
vector<int> edge[26];
bool check[26][26] = {0};
int vis[26] = {0};
int main() {
  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 xx = s[j].size();
      int yy = s[i].size();
      int pp = min(xx, yy);
      for (int k = 0; k < pp; k++) {
        if (s[i][k] != s[j][k]) {
          int a = s[i][k] - 'a';
          int b = s[j][k] - 'a';
          if (check[a][b]) goto nxt;
          check[a][b] = true;
          edge[a].push_back(b);
          vis[b]++;
          goto nxt;
        }
      }
      if (s[i].size() > s[j].size()) {
        puts("Impossible");
        return 0;
      }
    nxt:;
    }
  }
  queue<int> que;
  string res = "";
  for (int i = 0; i < 26; i++)
    if (!vis[i]) que.push(i);
  bool used[26] = {};
  while (!que.empty()) {
    res.push_back(que.front() + 'a');
    int x = que.front();
    used[x] = true;
    que.pop();
    for (int i = 0; i < edge[x].size(); i++) {
      vis[edge[x][i]]--;
      if (vis[edge[x][i]] == 0) que.push(edge[x][i]);
    }
  }
  for (int i = 0; i < 26; i++)
    if (vis[i]) {
      puts("Impossible");
      return 0;
    }
  for (int i = 0; i < 26; i++)
    if (!used[i]) res.push_back(i + 'a');
  cout << res << endl;
}
