#include <bits/stdc++.h>
int dx[] = {0, -1, 0, 1, -1, 1, -1, 1};
int dy[] = {-1, 0, 1, 0, 1, -1, -1, 1};
const int N = 3e5 + 5, mod = 1e9 + 7;
using namespace std;
vector<int> g[30];
vector<char> vec;
bool vis[30];
void dfs(int node) {
  vis[node] = true;
  for (auto child : g[node])
    if (!vis[child]) dfs(child);
  vec.push_back((char)(node + 'a'));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  string arr[n + 5];
  for (int i = 0; i < n; i++) cin >> arr[i];
  for (int i = 1; i < n; i++) {
    int p1 = 0, p2 = 0;
    while (p1 < arr[i - 1].size() && p2 < arr[i].size()) {
      if (arr[i - 1][p1] != arr[i][p2]) {
        g[arr[i - 1][p1] - 'a'].push_back(arr[i][p2] - 'a');
        break;
      }
      p1++, p2++;
    }
    if (p2 == arr[i].size() && p1 < arr[i - 1].size())
      return cout << "Impossible", 0;
  }
  for (int i = 0; i < 26; i++) {
    bool mwgood = false;
    for (int j = 0; j < 26; j++) {
      for (auto it : g[j])
        if (it == i) mwgood = true;
    }
    if (!mwgood) dfs(i);
  }
  if (vec.size() != 26) return cout << "Impossible", 0;
  reverse(vec.begin(), vec.end());
  for (auto it : vec) cout << it;
  return 0;
}
