#include <bits/stdc++.h>
bool dfs(int node, std::vector<int>& vis, std::vector<int>& order,
         const std::vector<std::vector<int>>& adj) {
  if (vis[node]) {
    return vis[node] == 2;
  }
  vis[node] = 1;
  for (int i = 0; i < 26; i++) {
    if (adj[node][i]) {
      if (!dfs(i, vis, order, adj)) {
        return false;
      }
    }
  }
  order.push_back(node);
  vis[node] = 2;
  return true;
}
int main() {
  int n;
  std::cin >> n;
  std::vector<std::vector<int>> lt(26, std::vector<int>(26));
  std::string prev_name = "";
  int good = 1;
  for (int i = 0; i < n; i++) {
    std::string name;
    std::cin >> name;
    size_t until = std::min(name.size(), prev_name.size());
    for (size_t i = 0; i < until; i++) {
      if (name[i] != prev_name[i]) {
        lt[prev_name[i] - 'a'][name[i] - 'a'] = 1;
        break;
      }
    }
    good &= (name.substr(0, until) != prev_name.substr(0, until) ||
             prev_name.size() <= name.size());
    prev_name = name;
  }
  int num_alphabets = 26;
  for (int k = 0; k < num_alphabets; k++) {
    for (int i = 0; i < num_alphabets; i++) {
      for (int j = 0; j < num_alphabets; j++) {
        lt[i][j] |= (lt[i][k] & lt[k][j]);
      }
    }
  }
  std::vector<int> vis(26);
  std::vector<int> order;
  for (int i = 0; i < 26; i++) {
    good &= dfs(i, vis, order, lt);
  }
  if (!good) {
    std::cout << "Impossible" << std::endl;
  } else {
    std::reverse(order.begin(), order.end());
    for (auto it : order) {
      std::cout << static_cast<char>(it + 'a');
    }
    std::cout << std::endl;
  }
  return 0;
}
