#include <bits/stdc++.h>
using namespace std;
long long int gcd(long long int a, long long int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long int modpower(long long int x, long long int y, long long int p) {
  int res = 1;
  x = x % p;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
vector<int> e[26];
vector<pair<int, int> > out(26);
vector<int> vis(26, 0);
int tim = 1, no = 0;
void dfs(int i, int ansc) {
  if (vis[i]) return;
  vis[i] = 1;
  tim++;
  for (int j : e[i]) {
    if (vis[j]) {
      if (j == ansc) no = 1;
    }
    dfs(j, ansc);
  }
  tim++;
  out[i].first = tim;
}
void JAISHREERAM() {
  long long int n, i, j, ans = 0;
  cin >> n;
  string a[n];
  for (long long int i = 0; i < n; i++) cin >> a[i];
  for (i = 0; i < n - 1; i++) {
    int x = a[i].size(), y = a[i + 1].size();
    bool f = 0;
    for (j = 0; j < x && j < y; j++) {
      if (a[i][j] == a[i + 1][j]) continue;
      f = 1;
      e[a[i][j] - 'a'].emplace_back(a[i + 1][j] - 'a');
      break;
    }
    if (!f && x > y) no = 1;
  }
  for (i = 0; i < 26; i++) {
    fill(vis.begin(), vis.end(), 0);
    dfs(i, i);
  }
  fill(vis.begin(), vis.end(), 0);
  tim = 1;
  for (i = 0; i < 26; i++) out[i] = {10000, i};
  for (i = 0; i < 26; i++) {
    if (!vis[i]) dfs(i, i);
  }
  if (no) {
    cout << "Impossible\n";
    return;
  }
  sort(out.rbegin(), out.rend());
  for (i = 0; i < 26; i++) {
    char c = 'a' + out[i].second;
    cout << c;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ;
  int T = 1;
  for (int t = 1; t <= T; t++) {
    JAISHREERAM();
  }
  return 0;
}
