#include <bits/stdc++.h>
using namespace std;
int n, cycle, vis[30];
string s[109];
vector<vector<int> > E(30);
vector<int> tp;
void dfs(int node) {
  vis[node] = 1;
  for (int i = 0; i < E[node].size(); i++) {
    if (vis[E[node][i]] == 1) cycle = 1;
    if (!vis[E[node][i]]) dfs(E[node][i]);
  }
  vis[node] = 2;
}
void tpo(int node) {
  vis[node] = 1;
  for (int i = 0; i < E[node].size(); i++)
    if (!vis[E[node][i]]) tpo(E[node][i]);
  tp.push_back(node);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 1; i < n; i++) {
    int sz = min(s[i].length(), s[i - 1].length());
    int pos = -1;
    for (int h = 0; h < sz; h++)
      if (s[i][h] != s[i - 1][h]) {
        pos = h;
        break;
      }
    if (pos == -1) {
      if (s[i - 1].length() > s[i].length()) {
        cout << "Impossible";
        return 0;
      }
    } else
      E[s[i - 1][pos] - 'a'].push_back(s[i][pos] - 'a');
  }
  for (int i = 0; i < 26; i++)
    if (!vis[i]) dfs(i);
  if (cycle) {
    cout << "Impossible";
    return 0;
  }
  fill(vis, vis + 30, 0);
  for (int i = 0; i < 26; i++)
    if (!vis[i]) tpo(i);
  for (int i = 25; i >= 0; i--) cout << (char)('a' + tp[i]);
}
