#include <bits/stdc++.h>
using namespace std;
void FastIO() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
}
int flag;
vector<vector<int> > V;
vector<int> topo;
vector<int> marked;
bool valid;
void dfs(int pos) {
  marked[pos] = 1;
  for (int i = 0; i < (int)V[pos].size(); i++) {
    int x = V[pos][i];
    if (!marked[x]) {
      dfs(x);
    } else if (marked[x] == 1) {
      valid = false;
    }
  }
  topo.push_back(pos);
  marked[pos] = 2;
}
int main() {
  FastIO();
  int n, l1, l2;
  cin >> n;
  string second, prev;
  V.assign(26, vector<int>());
  for (int i = 0; i < (int)n; i++) {
    cin >> second;
    if (i) {
      l1 = second.length(), l2 = prev.length(), flag = 0;
      for (int j = 0; j < (int)min(l1, l2); j++) {
        if (second[j] != prev[j]) {
          int first = 0;
          for (int k = 0; k < (int)V[prev[j] - 'a'].size(); k++) {
            int y = V[prev[j] - 'a'][k];
            if (y == second[j] - 'a') {
              first = 1;
              break;
            }
          }
          if (!first) V[prev[j] - 'a'].push_back(second[j] - 'a');
          flag = 1;
          break;
        }
      }
      if (!flag && l2 > l1) {
        flag = 2;
      }
    }
    prev = second;
  }
  if (flag == 2) {
    cout << "Impossible" << '\n';
    return 0;
  }
  marked.assign(26, 0);
  flag = 0;
  valid = true;
  for (int i = 0; i < (int)26; i++) {
    if (!marked[i]) {
      flag++;
      dfs(i);
      if (valid == false) {
        cout << "Impossible" << '\n';
        return 0;
      }
    }
  }
  for (int i = 0; i < (int)26; i++) {
    if (!marked[i]) {
      topo.push_back(i);
    }
  }
  reverse((topo).begin(), (topo).end());
  for (int i = 0; i < (int)26; i++) {
    cout << (char)('a' + topo[i]);
  }
  cout << '\n';
  return 0;
}
