#include <bits/stdc++.h>
using namespace std;
int visited[100005];
vector<int> adj[100005];
stack<int> s;
queue<int> q;
int count1, count2;
int indegree[100005];
int print[100005];
vector<int> top_order;
int min(int a, int b) { return a < b ? a : b; }
int main() {
  int n, i, j;
  cin >> n;
  string s[n];
  for (i = 0; i < n; i++) {
    cin >> s[i];
  }
  for (i = 0; i < n - 1; i++) {
    int k = 0;
    int l1 = (int)s[i].size();
    int l2 = (int)s[i + 1].size();
    while (s[i][k] - 'a' == s[i + 1][k] - 'a' && k < min(l1, l2)) {
      k++;
    }
    if (k == min(l1, l2)) {
      if (l1 > l2) {
        cout << "Impossible\n";
        return 0;
      }
      continue;
    }
    adj[s[i][k] - 'a'].push_back(s[i + 1][k] - 'a');
    indegree[s[i + 1][k] - 'a']++;
  }
  for (i = 0; i < 26; i++)
    if (indegree[i] == 0 && adj[i].size() > 0) q.push(i);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    top_order.push_back(x);
    for (i = 0; i < adj[x].size(); i++) {
      indegree[adj[x][i]]--;
      if (indegree[adj[x][i]] == 0) q.push(adj[x][i]);
    }
  }
  for (i = 0; i < 26; i++) {
    if (indegree[i] > 0) {
      cout << "Impossible\n";
      return 0;
    }
  }
  int arr[100005];
  int point[100005] = {0};
  for (i = 0; i < top_order.size(); i++) {
    arr[i] = top_order[i];
    print[top_order[i]] = 1;
    printf("%c", top_order[i] + 'a');
  }
  for (i = 0; i < 26; i++) {
    if (print[i] != 1) printf("%c", i + 'a');
  }
  cout << endl;
  return 0;
}
