#include <bits/stdc++.h>
long long mpow(long long a, long long n, long long mod) {
  long long ret = 1;
  long long b = a;
  while (n) {
    if (n & 1) ret = (ret * b) % mod;
    b = (b * b) % mod;
    n >>= 1;
  }
  return (long long)ret;
}
using namespace std;
bool ok = true;
string s[101];
int n;
int vis[101];
vector<int> graph[101];
int c = 0;
vector<int> order;
void dfs(int u) {
  vis[u] = 1;
  for (int j = 0; j < graph[u].size(); j++) {
    int to = graph[u][j];
    if (vis[to] == 1) {
      ok = false;
      return;
    }
    if (vis[to] == 2) continue;
    dfs(to);
  }
  vis[u] = 2;
  order.push_back(u);
}
void add(string s1, string s2) {
  int i, j = 0;
  for (i = 0; i < s1.size(); i++) {
    if (j == s2.size()) {
      ok = false;
      return;
    }
    if (s1[i] == s2[j]) {
      j++;
      continue;
    }
    int u = s1[i] - 'a';
    int v = s2[i] - 'a';
    graph[u].push_back(v);
    break;
  }
}
int main() {
  int i, j;
  cin >> n;
  memset(vis, 0, sizeof(vis));
  for (j = 0; j < n; j++) cin >> s[j];
  for (i = 0; i < n; i++) {
    for (j = i + 1; j < n; j++) {
      add(s[i], s[j]);
      if (!ok) {
        cout << "Impossible";
        return 0;
      }
    }
  }
  for (j = 0; j < 26; j++) {
    if (vis[j] == 0) {
      dfs(j);
    }
  }
  if (!ok) {
    cout << "Impossible";
    return 0;
  }
  reverse(order.begin(), order.end());
  for (j = 0; j < order.size(); j++) cout << (char)(order[j] + 'a');
  return 0;
}
