#include <bits/stdc++.h>
using namespace std;
const int X = 100;
string s[X];
vector<int> lst[X];
bool pr[X], out[X];
bool flag = false;
void sol(int ln, int l, int r) {
  if (flag) return;
  if (r - l <= 1) return;
  int prev = l;
  for (int i = l + 1; i < r; i++) {
    if (ln == s[i].size() && s[i].size() < s[i - 1].size()) {
      flag = true;
      return;
    }
  }
  for (int i = l + 1; i < r; i++) {
    if (flag) return;
    if (s[i - 1].size() == ln) {
      prev = i;
      continue;
    }
    if (s[i][ln] != s[i - 1][ln]) {
      sol(ln + 1, prev, i);
      prev = i;
      if (flag) return;
      lst[s[i - 1][ln] - 'a'].push_back(s[i][ln] - 'a');
      pr[s[i][ln] - 'a'] = true;
    }
  }
  sol(ln + 1, prev, r);
}
bool used[X];
vector<int> vec;
void dfs(int s) {
  if (flag) return;
  used[s] = true;
  for (int i = 0; i < lst[s].size(); i++) {
    if (flag) return;
    int to = lst[s][i];
    if (used[to] && !out[to]) {
      flag = true;
      return;
    }
    if (!used[to]) dfs(to);
  }
  out[s] = true;
  vec.push_back(s);
}
int main() {
  int n, i, j;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  sol(0, 0, n);
  for (int i = 0; i < 26; i++) {
    if (!pr[i]) {
      dfs(i);
    }
  }
  for (int i = 0; i < 26; i++) {
    if (!used[i]) flag = true;
  }
  if (flag) {
    cout << "Impossible";
    return 0;
  }
  reverse(vec.begin(), vec.end());
  for (int i = 0; i < 26; i++) {
    cout << (char)(vec[i] + 'a');
  }
  return 0;
}
