#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > graph;
stack<int> order;
int visit[26 + 1];
int find_order(string a, string b) {
  int len = min(a.length(), b.length());
  for (int i = 0; i < len; i++) {
    if (a[i] != b[i]) {
      graph[a[i] - 96].push_back(b[i] - 96);
      return 0;
    }
  }
  if (a.length() > b.length()) return -1;
  return 0;
}
int dfs(int cur) {
  if (visit[cur] == -1) return -1;
  if (visit[cur]) return 0;
  visit[cur] = -1;
  vector<int>::iterator itr;
  for (itr = graph[cur].begin(); itr != graph[cur].end(); ++itr) {
    if (dfs(*itr) == -1) return -1;
  }
  visit[cur] = 1;
  order.push(cur);
  return 0;
}
int main() {
  int N;
  vector<int> temp;
  vector<int>::iterator itr;
  for (int i = 0; i < 27; i++) graph.push_back(temp);
  vector<string> inp;
  string str;
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> str;
    inp.push_back(str);
  }
  for (int i = 0; i < N; i++) {
    for (int j = i + 1; j < N; j++) {
      if (find_order(inp[i], inp[j]) == -1) {
        cout << "Impossible" << endl;
        return 0;
      }
    }
  }
  memset(visit, 0, sizeof(visit));
  for (int i = 1; i < 27; i++) {
    if (!visit[i] && dfs(i) == -1) {
      cout << "Impossible" << endl;
      return 0;
    }
  }
  while (!order.empty()) {
    cout << char(96 + order.top());
    order.pop();
  }
  cout << endl;
  return 0;
}
