#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:128777216")
using namespace std;
const long long LINF = 1000000000000000000LL;
const int INF = 1000000000;
const long double eps = 1e-9;
const long double PI = 3.1415926535897932384626433832795l;
void prepare(string s) {
  if (s.length() != 0) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
  }
}
const int NMAX = 105;
int n;
string s[NMAX];
vector<int> g[26];
vector<int> ord;
int used[NMAX];
void read() {
  scanf("%d\n", &n);
  for (int i = 0; i < (int)(n); i++) {
    char tmp[NMAX];
    scanf("%s", tmp);
    s[i] = tmp;
  }
}
void dfs(int v) {
  used[v] = 1;
  for (int i = 0; i < (int)((int)((g[v]).size())); i++) {
    int u = g[v][i];
    if (used[u] == 1) {
      printf("Impossible\n");
      exit(0);
    } else {
      if (used[u] == 0) {
        dfs(u);
      }
    }
  }
  used[v] = 2;
  ord.push_back(v);
}
void solve() {
  for (int i = 0; i < (int)(n - 1); i++) {
    int j = 0;
    while (j < (int)((s[i]).size()) && j < (int)((s[i + 1]).size()) &&
           s[i][j] == s[i + 1][j])
      j++;
    if (j < (int)((s[i]).size()) && j < (int)((s[i + 1]).size()))
      g[s[i][j] - 'a'].push_back(s[i + 1][j] - 'a');
    else {
      if ((int)((s[i]).size()) > (int)((s[i + 1]).size())) {
        printf("Impossible\n");
        exit(0);
      }
    }
  }
  memset(used, 0, sizeof(used));
  for (int i = 0; i < (int)(26); i++)
    if (!used[i]) dfs(i);
  for (int i = (int)(26) - 1; i >= 0; i--) printf("%c", ord[i] + 'a');
  printf("\n");
}
int main() {
  prepare("");
  read();
  solve();
  return 0;
}
