#include <bits/stdc++.h>
using namespace std;
vector<char> top_sort;
int flag2 = 0;
set<char> gray;
void dfs_top(int num, int visited[], vector<char> *v) {
  gray.insert((char)(num + 97));
  for (int i = 0; i < (int)v[num].size(); i++) {
    if (gray.find(v[num][i]) != gray.end())
      flag2 = 1;
    else if (visited[(int)(v[num][i]) - 97] == 0)
      dfs_top((int)(v[num][i]) - 97, visited, v);
  }
  top_sort.push_back((char)(num + 97));
  visited[num] = 1;
  gray.erase((char)(num + 97));
  return;
}
int main() {
  int n, flag = 0;
  set<int> temp_vis;
  vector<char> v[26];
  string s;
  cin >> n;
  vector<string> names;
  cin >> s;
  names.push_back(s);
  for (int i = 0; i < n - 1; i++) {
    cin >> s;
    string s1 = names[i];
    if (flag == 0) {
      int k = 0, flag1 = 0;
      while (s[k] == s1[k]) {
        k++;
        if (k > s.length() - 1) {
          flag = 1;
          break;
        }
        if (k > s1.length() - 1) {
          flag1 = 1;
          break;
        }
      }
      if (flag1 == 0 && flag == 0) {
        v[(int)s1[k] - 97].push_back(s[k]);
      }
    }
    names.push_back(s);
  }
  if (flag == 1) {
    cout << "Impossible" << endl;
    return 0;
  }
  int visited[26];
  memset(visited, 0, sizeof(visited));
  for (int i = 0; i < 26; i++) {
    if (visited[i] == 0) dfs_top(i, visited, v);
  }
  if (flag2 == 0) {
    for (int i = top_sort.size() - 1; i >= 0; i--) cout << top_sort[i];
    cout << endl;
  } else
    cout << "Impossible" << endl;
  return 0;
}
