#include <bits/stdc++.h>
using namespace std;
string s[100];
vector<int> G[26];
int vis[26];
int topo[26];
int t;
bool dfs(int x) {
  vis[x] = -1;
  for (auto cx : G[x]) {
    if (vis[cx] == -1) return false;
    if (vis[cx] == 0 && dfs(cx) == false) return false;
  }
  vis[x] = 1;
  topo[--t] = x;
  return true;
}
bool toposort(int n) {
  t = n;
  memset(vis, 0, sizeof vis);
  for (int i = 0; i < n; i++) {
    if (vis[i] == 0 && dfs(i) == false) return false;
  }
  return true;
}
int main() {
  int n;
  bool ans;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  for (int i = 0; i < n - 1; i++) {
    int x = i, y = i + 1;
    int c = 0;
    while (s[x][c] == s[y][c]) c++;
    if (c == s[x].length())
      continue;
    else if (c != s[x].length() && c == s[y].length())
      goto l1;
    else if (c != s[x].length() && c != s[y].length()) {
      G[s[x][c] - 'a'].push_back(s[y][c] - 'a');
    }
  }
  ans = toposort(26);
  if (ans == 1) {
    for (int i = 0; i < 26; i++) {
      cout << (char)(topo[i] + 'a');
    }
    return 0;
  }
l1:
  cout << "Impossible" << endl;
  return 0;
}
