#include <bits/stdc++.h>
using namespace std;
bool dfs1(vector<vector<int>>& grp, vector<int>& vis, int f, int s) {
  vis[s] = 1;
  for (int i = 0; i < grp[s].size(); i++) {
    if (!vis[grp[s][i]])
      return dfs1(grp, vis, f, grp[s][i]);
    else {
      if (grp[s][i] == f) {
        return 1;
      }
    }
  }
  return 0;
}
void dfs(vector<vector<int>>& grp, vector<int>& vis, stack<int>& st, int i) {
  for (int j = 0; j < grp[i].size(); j++) {
    if (!vis[grp[i][j]]) {
      vis[grp[i][j]] = 1;
      dfs(grp, vis, st, grp[i][j]);
    }
  }
  st.push(i);
}
int main() {
  int n;
  cin >> n;
  vector<string> v(n);
  for (int i = 0; i < n; i++) {
    cin >> v[i];
  }
  vector<vector<int>> grp(26);
  int i = 0;
  while (i < n - 1) {
    int j = 0;
    while (j < v[i].size() && j < v[i + 1].size()) {
      if (v[i][j] == v[i + 1][j])
        j++;
      else
        break;
    }
    if (j >= v[i + 1].size()) {
      cout << "Impossible" << endl;
      return 0;
    } else if (j >= v[i].size()) {
    } else {
      grp[v[i][j] - 'a'].push_back(v[i + 1][j] - 'a');
    }
    i++;
  }
  vector<int> vis(26, 0);
  stack<int> st;
  for (int i = 0; i < 26; i++) {
    vector<int> vis1(26, 0);
    if (dfs1(grp, vis1, i, i)) {
      cout << "Impossible" << endl;
      return 0;
    }
  }
  for (int i = 0; i < 26; i++) {
    if (!vis[i]) {
      vis[i] = 1;
      dfs(grp, vis, st, i);
    }
  }
  while (!st.empty()) {
    cout << char(st.top() + 'a');
    st.pop();
  }
  return 0;
}
