#include <bits/stdc++.h>
using namespace std;
bool mark[27][27] = {false}, vis[27] = {false};
vector<char> st;
set<char> se;
bool comp(string &s1, string &s2) {
  int i, l1 = s1.size(), l2 = s2.size();
  if (l1 <= l2) {
    if (s2.find(s1) == 0) return true;
  } else {
    if (s1.find(s2) == 0) return false;
  }
  for (i = 0; i < min(l1, l2); i++) {
    if (s1[i] == s2[i]) continue;
    mark[s2[i] - 'a'][s1[i] - 'a'] = true;
    return true;
  }
  return true;
}
bool dfs(int nod) {
  int i;
  vis[nod] = true;
  bool f = false;
  se.insert(nod + 'a');
  for (i = 0; i < 26; i++) {
    if (mark[nod][i]) {
      if (!vis[i])
        f = f || dfs(i);
      else if (se.count(i + 'a'))
        return true;
    }
  }
  se.erase(se.find(nod + 'a'));
  st.push_back(nod + 'a');
  return f;
}
int main() {
  ios_base::sync_with_stdio(false);
  int i, n;
  string s;
  cin >> n;
  vector<string> ve;
  for (i = 0; i < n; i++) {
    cin >> s;
    ve.push_back(s);
  }
  bool ans = true;
  for (i = 0; i < n - 1; i++) {
    ans = ans && comp(ve[i], ve[i + 1]);
  }
  for (i = 0; i < 26; i++)
    if (!vis[i]) ans = ans && !dfs(i);
  if (ans) {
    for (i = 0; i < 26; i++) cout << st[i];
  } else
    cout << "Impossible";
  return 0;
}
