#include <bits/stdc++.h>
using namespace std;
int graph[26][26];
int floyd() {
  for (int k = 0; k < 26; k++) {
    for (int i = 0; i < 26; i++) {
      for (int j = 0; j < 26; j++) {
        if (graph[i][k] && graph[k][j]) {
          graph[i][j] = 1;
        }
      }
    }
  }
}
int cmpStr(string &s1, string &s2) {
  int len = s1.size();
  for (int i = 0; i < len; i++) {
    if (i >= s2.size()) {
      return 0;
    }
    if (s1[i] != s2[i]) {
      int u = s1[i] - 'a';
      int v = s2[i] - 'a';
      if (graph[v][u]) return 0;
      graph[u][v] = 1;
      floyd();
      return 1;
    }
  }
  return 1;
}
vector<string> v;
int main() {
  for (int i = 0; i < 26; i++) {
    for (int j = 0; j < 26; j++) {
      graph[i][j] = 0;
    }
  }
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    v.push_back(s);
  }
  for (int i = 0; i < n - 1; i++) {
    if (cmpStr(v[i], v[i + 1]))
      continue;
    else {
      cout << "Impossible" << endl;
      return 0;
    }
  }
  queue<char> c;
  int inEdge[26];
  for (int i = 0; i < 26; i++) {
    inEdge[i] = 0;
    for (int j = 0; j < 26; j++) {
      if (graph[j][i]) inEdge[i]++;
    }
    if (inEdge[i] == 0) c.push(i);
  }
  while (!c.empty()) {
    cout << (char)(c.front() + 'a');
    int u = c.front();
    c.pop();
    for (int i = 0; i < 26; i++) {
      if (graph[u][i]) {
        graph[u][i] = 0;
        inEdge[i]--;
        if (inEdge[i] == 0) {
          c.push(i);
        }
      }
    }
  }
}
