#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100 + 5;
const int MAXL = 100 + 5;
queue<int> q;
struct Edge {
  int x, y, next;
  Edge() {}
  Edge(int x, int y, int next) : x(x), y(y), next(next) {}
};
Edge e[MAXN];
char str[MAXN][MAXL], ans[50];
int fir[50], indeg[50], n, ce;
bool flag;
void add(int x, int y) {
  ++indeg[y];
  e[++ce] = Edge(x, y, fir[x]);
  fir[x] = ce;
}
bool work(char *s1, char *s2) {
  int n1 = strlen(s1), n2 = strlen(s2);
  for (int i = 0; i < n1; ++i) {
    if (i == n2) return false;
    if (s1[i] != s2[i]) {
      add(s1[i] - 97, s2[i] - 97);
      return true;
    }
  }
  return true;
}
void check() {
  for (int i = 0; i < 26; ++i) {
    if (indeg[i] == 0) q.push(i);
  }
  int cnt = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    ans[cnt++] = 97 + x;
    for (int p = fir[x]; p; p = e[p].next) {
      int &y = e[p].y;
      if (--indeg[y] == 0) {
        q.push(y);
      }
    }
  }
  ans[cnt] = '\0';
  if (cnt == 26)
    puts(ans);
  else
    puts("Impossible");
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", str[i]);
  }
  for (int i = 1; i < n; ++i) {
    if (!work(str[i], str[i + 1])) {
      puts("Impossible");
      return 0;
    }
  }
  check();
  return 0;
}
