#include <bits/stdc++.h>
using namespace std;
vector<string> names;
long long n;
unordered_map<char, vector<char>> adj;
unordered_map<char, bool> vis;
unordered_map<char, long long> currentpath;
bool IsCycle(long long src) {
  vis[src] = true;
  currentpath[src] = 1;
  for (auto x : adj[src]) {
    if (!vis[x]) {
      bool sub = IsCycle(x);
      if (sub) return true;
    } else if (vis[x] == true and currentpath[x] == 1) {
      return true;
    }
  }
  currentpath[src] = 0;
  return false;
}
void topsort() {
  unordered_map<char, long long> indegree;
  for (char ch = 'a'; ch <= 'z'; ch++) indegree[ch] = 0;
  for (auto x : adj) {
    for (auto y : x.second) indegree[y]++;
  }
  queue<long long> q;
  for (auto x : indegree) {
    if (x.second == 0) q.push(x.first);
  }
  while (!q.empty()) {
    char u = q.front();
    q.pop();
    cout << u;
    for (auto x : adj[u]) {
      indegree[x]--;
      if (indegree[x] == 0) q.push(x);
    }
  }
}
void constructGraph() {
  for (long long i = 0; i < n - 1; i++) {
    string up = names[i];
    string down = names[i + 1];
    long long upi = 0, downi = 0;
    long long k = min(up.size(), down.size());
    long long j;
    for (j = 0; j < k; j++) {
      if (up[j] != down[j]) {
        adj[up[j]].push_back(down[j]);
        break;
      }
    }
    if (j == k) {
      if (up.size() > down.size()) {
        cout << "Impossible";
        exit(0);
        return;
      }
    }
  }
  for (char ch = 'a'; ch <= 'z'; ch++) {
    vis[ch] = false;
  }
  bool cyc = false;
  for (char ch = 'a'; ch <= 'z'; ch++) {
    if (!vis[ch]) {
      if (IsCycle(ch)) {
        cout << "Impossible";
        exit(0);
        return;
      }
    }
  }
  topsort();
}
int32_t main() {
  cin >> n;
  for (long long i = 0; i < n; i++) {
    string name;
    cin >> name;
    names.push_back(name);
  }
  constructGraph();
  return 0;
}
