#include <bits/stdc++.h>
using namespace std;
const int MAX = 26;
vector<int> adj[MAX];
vector<int> adj_reversed[MAX];
bool vis[MAX];
bool foundCycle(int root, int cur) {
  if (root == cur && vis[cur]) {
    return true;
  } else if (root != cur && vis[cur]) {
    return false;
  }
  vis[cur] = true;
  int n = (int)adj[cur].size();
  for (int i = 0; i < n; i++) {
    if (foundCycle(root, adj[cur][i])) return true;
  }
  return false;
}
string resultTopologicalSort = "";
void topologicalSort(int cur) {
  if (vis[cur]) return;
  vis[cur] = true;
  int n = (int)adj_reversed[cur].size();
  for (int i = 0; i < n; i++) {
    topologicalSort(adj_reversed[cur][i]);
  }
  resultTopologicalSort += (char)(cur + 'a');
}
int main() {
  int n;
  cin >> n;
  vector<string> s(n);
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 0; i < n - 1; i++) {
    int sz1 = (int)s[i].size();
    int sz2 = (int)s[i + 1].size();
    for (int j = 0; j < sz1; j++) {
      if (sz2 <= j) {
        cout << "Impossible" << '\n';
        return 0;
      }
      if (s[i][j] != s[i + 1][j]) {
        adj[s[i][j] - 'a'].push_back(s[i + 1][j] - 'a');
        adj_reversed[s[i + 1][j] - 'a'].push_back(s[i][j] - 'a');
        break;
      }
    }
  }
  for (int i = 0; i < MAX; i++) {
    memset(vis, false, sizeof(vis));
    if (foundCycle(i, i)) {
      cout << "Impossible" << '\n';
      return 0;
    }
  }
  memset(vis, false, sizeof(vis));
  string answer = "";
  for (int i = 0; i < MAX; i++) {
    if (!vis[i] && (int)adj[i].size() == 0) {
      resultTopologicalSort = "";
      topologicalSort(i);
      answer += resultTopologicalSort;
    }
  }
  cout << answer << '\n';
  return 0;
}
