#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int from;
  int to;
  int next;
} edge[1000];
char topo[27];
int tot = 0;
int last[30];
int in[30];
char s[1005][205];
int n;
void init() {
  for (int i = 1; i <= 1000; i++) edge[i].next = -1;
  memset(last, -1, sizeof(last));
  memset(in, 0, sizeof(in));
}
void addedge(char c1, char c2) {
  int i;
  int u = c1 - 'a' + 1;
  int v = c2 - 'a' + 1;
  for (i = last[u]; i != -1; i = edge[i].next) {
    if (edge[i].to == v) break;
  }
  if (i == -1) {
    tot++;
    in[v]++;
    Edge E = {u, v, last[u]};
    edge[tot] = E;
    last[u] = tot;
  }
}
void solve() {
  priority_queue<int, vector<int>, greater<int> > q;
  stack<int> s;
  for (int i = 1; i <= 26; i++)
    if (in[i] == 0) q.push(i);
  int cnt = 0;
  while (!q.empty()) {
    int u = q.top();
    q.pop();
    s.push(u);
    cnt++;
    for (int i = last[u]; i != -1; i = edge[i].next) {
      int v = edge[i].to;
      if (--in[v] == 0) q.push(v);
    }
  }
  if (cnt < 26) {
    printf("Impossible\n");
    return;
  }
  int num = 25;
  while (s.size() > 0) {
    topo[num--] = s.top() + 'a' - 1;
    s.pop();
  }
  topo[26] = '\0';
  printf("%s\n", topo);
}
int main() {
  scanf("%d", &n);
  init();
  getchar();
  for (int i = 1; i <= n; i++) {
    scanf("%s", s[i]);
    getchar();
    if (i > 1) {
      bool flag = false;
      for (int j = 0; j < min(strlen(s[i - 1]), strlen(s[i])); j++) {
        if (s[i - 1][j] != s[i][j]) {
          addedge(s[i - 1][j], s[i][j]);
          flag = true;
          break;
        }
      }
      if (!flag && (strlen(s[i - 1]) > strlen(s[i])))
        return !printf("Impossible\n");
    }
  }
  solve();
  return 0;
}
