#include <bits/stdc++.h>
using namespace std;
vector<int> g[26];
string s[105];
int mark[26];
bool check_loop(int node) {
  bool ret = 0;
  mark[node] = 2;
  for (auto &new_node : g[node]) {
    if (mark[new_node] == 2)
      return true;
    else if (mark[new_node] == 0)
      ret |= check_loop(new_node);
  }
  mark[node] = 1;
  return ret;
}
vector<int> vec;
void topo(int node) {
  mark[node] = 1;
  for (auto &new_node : g[node]) {
    if (!mark[new_node]) topo(new_node);
  }
  vec.push_back(node);
}
void term() {
  cout << "Impossible";
  exit(0);
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 0; i < n - 1; i++) {
    bool f = 0;
    for (int idx = 0; idx < min(s[i].size(), s[i + 1].size()); idx++) {
      if (s[i][idx] != s[i + 1][idx]) {
        g[s[i][idx] - 'a'].push_back(s[i + 1][idx] - 'a');
        f = 1;
        break;
      }
    }
    if (!f && s[i].size() > s[i + 1].size()) term();
  }
  for (int i = 0; i < 26; i++) {
    if (mark[i] == 0) {
      if (check_loop(i)) term();
    }
  }
  memset(mark, 0, sizeof mark);
  for (int i = 0; i < 26; i++) {
    if (mark[i] == 0) topo(i);
  }
  reverse(vec.begin(), vec.end());
  for (auto &x : vec) cout << (char)(x + 'a');
  return 0;
}
