#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
template <typename T, typename U>
inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void amax(T &x, U y) {
  if (x < y) x = y;
}
template <typename T>
inline void write(T x) {
  int i = 20;
  char buf[21];
  buf[20] = '\n';
  do {
    buf[--i] = x % 10 + '0';
    x /= 10;
  } while (x);
  do {
    putchar(buf[i]);
  } while (buf[i++] != '\n');
}
template <typename T>
inline T readInt() {
  T n = 0, s = 1;
  char p = getchar();
  if (p == '-') s = -1;
  while ((p < '0' || p > '9') && p != EOF && p != '-') p = getchar();
  if (p == '-') s = -1, p = getchar();
  while (p >= '0' && p <= '9') {
    n = (n << 3) + (n << 1) + (p - '0');
    p = getchar();
  }
  return n * s;
}
class Debugger {
 public:
  Debugger(const std::string &_separator = " - ")
      : first(true), separator(_separator) {}
  template <typename ObjectType>
  Debugger &operator,(const ObjectType &v) {
    if (!first)
    std:
      cerr << separator;
    std::cerr << v;
    first = false;
    return *this;
  }
  ~Debugger() {
  std:
    cerr << endl;
  }

 private:
  bool first;
  std::string separator;
};
vector<int> primes;
void sieve() {
  bool composite[100005];
  composite[0] = true;
  composite[1] = true;
  for (int i = 2; i * i < 100005; i++) {
    if (!composite[i]) {
      primes.push_back(i);
      for (int j = 2 * i; j < 100005; j += i) composite[j] = true;
    }
  }
}
void dfs(long long u, vector<vector<long long>> &g, vector<bool> &visited,
         stack<long long> &s) {
  visited[u] = true;
  for (long long v : g[u]) {
    if (!visited[v]) dfs(v, g, visited, s);
  }
  s.push(u);
}
bool is_cyclic(vector<vector<long long>> &g, map<long long, long long> &pos) {
  for (long long i = 0; i < g.size(); i++) {
    for (long long v : g[i]) {
      if (pos[i] > pos[v]) return true;
    }
  }
  return false;
}
void solve() {
  long long n;
  cin >> n;
  long long max_length = 0;
  string names[n];
  for (long long i = 0; i < n; i++) {
    cin >> names[i];
    max_length = max(max_length, (long long)names[i].length());
  }
  bool adj_matrix[26][26] = {0};
  for (long long i = 1; i < n; i++) {
    long long j = 0;
    bool prefix = true;
    while (j < names[i].length()) {
      if (names[i - 1][j] != names[i][j]) {
        prefix = false;
        break;
      }
      j++;
    }
    if (prefix) {
      cout << "Impossible\n";
      return;
    }
    long long u = names[i - 1][j] - 'a';
    long long v = names[i][j] - 'a';
    adj_matrix[u][v] = true;
  }
  vector<vector<long long>> g(26, vector<long long>());
  for (long long i = 0; i < 26; i++) {
    for (long long j = 0; j < 26; j++) {
      if (adj_matrix[i][j]) {
        g[i].push_back(j);
      }
    }
  }
  vector<bool> visited(26);
  stack<long long> s;
  for (long long i = 0; i < 26; i++) {
    if (!visited[i]) {
      dfs(i, g, visited, s);
    }
  }
  vector<long long> tsort;
  map<long long, long long> pos;
  long long idx = 0;
  while (!s.empty()) {
    tsort.push_back(s.top());
    pos[s.top()] = idx++;
    s.pop();
  }
  if (is_cyclic(g, pos)) {
    cout << "Impossible\n";
  } else {
    for (long long i : tsort) {
      cout << (char)('a' + i);
    }
    cout << "\n";
  }
}
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
