#include <bits/stdc++.h>
using namespace std;
const int N = 110;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
int n, first[N], cnt, de[N], ans[N], tot;
struct node {
  int v, nxt;
} e[N * N * 2];
inline void add(int u, int v) {
  e[++cnt].v = v;
  e[cnt].nxt = first[u];
  first[u] = cnt;
}
char a[N][N];
int main() {
  n = read();
  for (int i = 1; i <= n; ++i) scanf("%s", a[i]);
  for (int i = 1; i <= n; ++i) {
    for (int k = i + 1; k <= n; ++k) {
      int j = 0, len1 = strlen(a[i]), len2 = strlen(a[k]);
      while (j < len1 && j < len2 && a[i][j] == a[k][j]) ++j;
      if (j == len1 && j == len2)
        continue;
      else if (j == len2) {
        puts("Impossible");
        return 0;
      } else if (j == len1)
        continue;
      else
        add(a[i][j] - 'a', a[k][j] - 'a'), de[a[k][j] - 'a']++;
    }
  }
  queue<int> q;
  for (int i = 0; i < 26; ++i)
    if (!de[i]) q.push(i);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    ans[tot++] = u;
    for (int i = first[u]; i; i = e[i].nxt) {
      int v = e[i].v;
      if ((--de[v]) == 0) q.push(v);
    }
  }
  if (tot < 25) {
    puts("Impossible");
    return 0;
  }
  for (int i = 0; i < 26; ++i) printf("%c", ans[i] + 'a');
  return 0;
}
