#include <bits/stdc++.h>
using namespace std;
inline void pr(int n) { printf("%d\n", n); }
const int fx[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
const int fxx[8][2] = {{0, 1}, {0, -1}, {1, 0},  {-1, 0},
                       {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
#pragma unused(fx)
#pragma unused(fxx)
template <typename T, typename TT>
ostream& operator<<(ostream& s, pair<T, TT> t) {
  return s << "(" << t.first << "," << t.second << ")";
}
template <typename T>
ostream& operator<<(ostream& s, vector<T> t) {
  for (int i = 0; i < ((int)((t).size())); i++) s << t[i] << " ";
  return s;
}
template <typename T, typename U>
std::pair<T, U> operator+(const std::pair<T, U>& l, const std::pair<T, U>& r) {
  return {l.first + r.first, l.second + r.second};
}
vector<int> color(26);
vector<vector<int> > graph(26, vector<int>());
vector<int> order;
int error = false;
void dfs(int root) {
  color[root] = 1;
  for (int i = 0; i < graph[root].size(); i++) {
    int v = graph[root][i];
    if (color[v] == 0) dfs(v);
    if (color[v] == 1) error = true;
    if (error) return;
  }
  color[root] = 2;
  order.push_back(root);
}
void compare(string n1, string n2) {
  if (error) return;
  int minl = min(n1.length(), n2.length());
  for (int i = 0; i < minl; i++) {
    if (n1[i] != n2[i]) {
      graph[n1[i] - 'a'].push_back(n2[i] - 'a');
      return;
    }
  }
  if (n1.length() < n2.length()) {
    error = true;
    return;
  }
}
int main() {
  int(n);
  scanf("%d", &(n));
  vector<string> names(n);
  for (int i = 0; i < n; i++) {
    cin >> names[i];
  }
  for (int i = 1; i < n; i++) compare(names[i], names[i - 1]);
  for (int i = 0; i < 26; i++) {
    if (color[i] == 0) dfs(i);
  }
  if (error) {
    cout << "Impossible";
    return 0;
  }
  for (int i = 0; i < order.size(); i++) {
    cout << (char)(order[i] + 'a');
  }
}
