#include <bits/stdc++.h>
using namespace std;
struct node {
  int to, next;
} edge[27 * 27 * 1000];
char s[105][105];
int head[27], cnt;
int d[27];
void addedge(int u, int v) {
  edge[cnt].to = v;
  edge[cnt].next = head[u];
  head[u] = cnt++;
  d[v]++;
}
int main() {
  int n;
  scanf("%d", &n);
  memset(head, -1, sizeof(head));
  cnt = 0;
  memset(d, 0, sizeof(d));
  for (int i = 0; i < n; i++) {
    scanf("%s", s[i]);
  }
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int k;
      for (k = 0; s[i][k] != '\0' && s[j][k] != '\0'; k++) {
        if (s[i][k] != s[j][k]) {
          addedge(s[i][k] - 'a', s[j][k] - 'a');
          break;
        }
      }
      if (s[i][k] == s[j][k]) {
      } else if (s[i][k] == '\0') {
      } else if (s[j][k] == '\0') {
        puts("Impossible");
        return 0;
      }
    }
  }
  queue<int> q;
  for (int i = 0; i < 26; i++) {
    if (d[i] == 0) q.push(i);
  }
  char ans[30];
  int len = 0;
  while (!q.empty()) {
    int temp = q.front();
    ans[len++] = 'a' + temp;
    q.pop();
    for (int i = head[temp]; i != -1; i = edge[i].next) {
      d[edge[i].to]--;
      if (d[edge[i].to] == 0) q.push(edge[i].to);
    }
  }
  for (int i = 0; i < 26; i++) {
    if (d[i]) {
      puts("Impossible");
      return 0;
    }
  }
  ans[len] = '\0';
  puts(ans);
  return 0;
}
