#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 110, MAX_V = 30;
int n, vis[MAX_V];
string s[MAX_N];
vector<int> AdjList[MAX_V], ts;
bool dfs(int u) {
  vis[u] = 0;
  bool ret = true;
  for (int j = 0; j < AdjList[u].size(); j++) {
    int v = AdjList[u][j];
    if (vis[v] == -1)
      ret &= dfs(v);
    else if (vis[v] == 0)
      return false;
  }
  vis[u] = 1;
  ts.push_back(u);
  return ret;
}
bool TopologicalSort() {
  bool ret = true;
  fill(vis, vis + MAX_V, -1);
  for (int u = 0; u < 26; u++)
    if (vis[u] == -1) ret &= dfs(u);
  reverse(ts.begin(), ts.end());
  return ret;
}
bool ConstructGraph() {
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      bool cmp = false;
      for (int k = 0; k < min(s[i].size(), s[j].size()); k++) {
        int u = s[i][k] - 'a', v = s[j][k] - 'a';
        if (u == v) continue;
        AdjList[u].push_back(v);
        cmp = true;
        break;
      }
      if (not cmp and s[i].size() > s[j].size()) return false;
    }
  return true;
}
void solve() {
  bool ret = ConstructGraph();
  ret &= TopologicalSort();
  if (not ret)
    puts("Impossible");
  else
    for (int i = 0; i < ts.size(); i++) putchar(ts[i] + 'a');
  putchar('\n');
}
void read() {
  scanf("%d\n", &n);
  for (int i = 0; i < n; i++) cin >> s[i];
}
int main() {
  read();
  solve();
  return (0);
}
