#include <bits/stdc++.h>
using namespace std;
vector<string> names;
vector<vector<int> > graf(102);
bool *vizitat = new bool[102];
stack<int> stiva;
bool numere[27];
set<int> numerele;
int n;
void compare(string s1, string s2) {
  int i = 0;
  while (s1[i] == s2[i] && i < s1.size() && i < s2.size()) i++;
  if ((i == s1.length() || i == s2.size()) && s1.length() > s2.size()) {
    cout << "Impossible";
    exit(0);
  }
  if (i == s1.length() || i == s2.size()) return;
  graf[s1[i] - 96].push_back(s2[i] - 96);
  numere[s1[i] - 96] = numere[s2[i] - 96] = true;
  numerele.insert(s1[i] - 96);
  numerele.insert(s2[i] - 96);
}
void DFS(int k, vector<bool> vizitated) {
  vizitated[k] = vizitat[k] = true;
  for (const auto &x : graf[k])
    if (vizitated[x])
      printf("Impossible"), exit(0);
    else if (!vizitat[x])
      DFS(x, vizitated);
}
void topsort(int k) {
  vizitat[k] = true;
  for (const auto &x : graf[k])
    if (!vizitat[x]) topsort(x);
  stiva.push(k);
}
int main() {
  cin >> n;
  string aux;
  for (int i = 1; i <= n; ++i) {
    cin >> aux;
    names.push_back(aux);
  }
  for (int i = 0; i < names.size(); ++i)
    for (int j = i + 1; j < names.size(); ++j) compare(names[i], names[j]);
  fill(vizitat + 1, vizitat + 26 + 1, false);
  vector<bool> auxilar(26 + 1, false);
  for (int i = 1; i <= 26; ++i)
    if (!vizitat[i]) DFS(i, auxilar);
  fill(vizitat + 1, vizitat + 26 + 1, false);
  for (int i = 1; i <= 26; ++i)
    if (!vizitat[i]) topsort(i);
  while (!stiva.empty()) printf("%c", stiva.top() + 96), stiva.pop();
  return 0;
}
