#include <bits/stdc++.h>
using namespace std;
std::vector<int> graph[105];
int vis[105] = {0}, vis2[105] = {0};
stack<int> order;
int cycle(int u, int parent[]) {
  parent[u] = 1;
  vis[u] = 1;
  for (int i = 0; i < graph[u].size(); i++) {
    if (parent[graph[u][i]]) return 1;
    if (!vis[graph[u][i]] && cycle(graph[u][i], parent)) return 1;
  }
  parent[u] = 0;
  return 0;
}
void topologicalsort(int u) {
  vis2[u] = 1;
  for (int i = 0; i < graph[u].size(); i++)
    if (!vis2[graph[u][i]]) topologicalsort(graph[u][i]);
  order.push(u);
}
int main() {
  int n;
  cin >> n;
  std::vector<string> v, copy;
  for (int i = 0; i < n; i++) {
    string str;
    cin >> str;
    v.push_back(str);
    copy.push_back(str);
  }
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < min(v[i].size(), v[i + 1].size()); j++) {
      if (v[i][j] != v[i + 1][j]) {
        graph[v[i][j] - 'a'].push_back(v[i + 1][j] - 'a');
        break;
      }
    }
  }
  int parent[105];
  for (int i = 0; i < 26; i++) {
    if (!vis[i]) {
      memset(parent, 0, sizeof(parent));
      if (cycle(i, parent)) {
        cout << "Impossible\n";
        return 0;
      }
    }
  }
  int flag = 0;
  for (int i = 0; i < 26; i++) {
    if (graph[i].size() > 0) flag = 1;
  }
  if (!flag) {
    sort(copy.begin(), copy.end());
    for (int i = 0; i < n; i++) {
      if (copy[i] != v[i]) {
        cout << "Impossible\n";
        return 0;
      }
    }
  }
  for (int i = 0; i < 26; i++)
    if (!vis2[i]) topologicalsort(i);
  while (!order.empty()) {
    char c = order.top() + 'a';
    cout << c;
    order.pop();
  }
  cout << endl;
  return 0;
}
