#include <bits/stdc++.h>
using namespace std;
const int MAX = 111, K = 26;
int n;
string name[MAX];
namespace G {
struct V : vector<int> {
  V() : odw(false) {}
  bool odw;
  int wyj;
};
V g[K];
void krawedz(char a, char b) {
  g[int(a) - int('a')].push_back(int(b) - int('a'));
}
int t = 0;
stack<int> stos;
void dfs(int v) {
  g[v].odw = true;
  for (int i = 0; i < ((int((g[v]).size()))); i++) {
    int u = g[v][i];
    if (!g[u].odw) dfs(u);
  }
  stos.push(v);
  g[v].wyj = t++;
}
bool poprawne_sortowanie() {
  for (int v = 0; v < (K); v++)
    for (int i = 0; i < ((int((g[v]).size()))); i++) {
      int u = g[v][i];
      if (g[v].wyj < g[u].wyj) return false;
    }
  return true;
}
bool sortowanie_topologiczne() {
  for (int i = 0; i < (K); i++)
    if (!g[i].odw) dfs(i);
  return poprawne_sortowanie();
}
void wypisz_sortowanie() {
  assert((int((stos).size())) == 26);
  while (!stos.empty()) {
    cout << char(int('a') + stos.top());
    stos.pop();
  }
  cout << '\n';
}
}  // namespace G
void wczytaj_dane() {
  cin >> n;
  for (int i = 0; i < (n); i++) cin >> name[i];
}
int roznica(const string& a, const string& b) {
  int m = min((int((a).size())), (int((b).size())));
  for (int i = 0; i < (m); i++)
    if (a[i] != b[i]) return i;
  return -1;
}
bool porownuj(const string& a, const string& b) {
  int i = roznica(a, b);
  if (i == -1) return (int((a).size())) < (int((b).size()));
  G::krawedz(a[i], b[i]);
  return true;
}
void zrob_test() {
  wczytaj_dane();
  for (int i = 0; i < (n - 1); i++)
    if (!porownuj(name[i], name[i + 1])) {
      cout << "Impossible\n";
      return;
    }
  if (G::sortowanie_topologiczne())
    G::wypisz_sortowanie();
  else
    cout << "Impossible\n";
}
int main() {
  ios_base::sync_with_stdio(0);
  zrob_test();
  return 0;
}
