#include <bits/stdc++.h>
const double Pi = acos(-1.0);
const double eps = 1e-8;
const int INF = 0x3f3f3f3f;
using namespace std;
struct node {
  int to, next;
} E[1000000];
string s[105];
int n, cnt;
int in[30];
int head[30];
void TOPO() {
  queue<int> Q;
  for (int i = 0; i < 26; ++i) {
    if (in[i] == 0) {
      Q.push(i);
    }
  }
  int p = 0;
  string ans;
  while (!Q.empty()) {
    int tmp = Q.front();
    Q.pop();
    ans += (tmp + 'a');
    for (int i = head[tmp]; i != -1; i = E[i].next) {
      in[E[i].to]--;
      if (in[E[i].to] == 0) {
        Q.push(E[i].to);
      }
    }
  }
  for (int i = 0; i < 26; ++i) {
    if (in[i]) {
      cout << "Impossible" << endl;
      return;
    }
  }
  cout << ans << endl;
  return;
}
void addedge(int u, int v) {
  E[cnt].to = v;
  E[cnt].next = head[u];
  head[u] = cnt++;
  in[v]++;
}
int main() {
  memset(head, -1, sizeof(head));
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
  }
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      int k;
      for (k = 0; k < s[i].size() && k < s[j].size(); ++k) {
        if (s[i][k] != s[j][k]) {
          addedge(s[i][k] - 'a', s[j][k] - 'a');
          break;
        }
      }
      if (k == s[j].size()) {
        cout << "Impossible" << endl;
        return 0;
      }
    }
  }
  TOPO();
  return 0;
}
