#include <bits/stdc++.h>
using namespace std;
struct node {
  long long visit;
  set<char> ss;
};
void dfs(map<char, node>& mm, char curr, vector<char>& topo, set<char> cyc,
         bool& imp) {
  if (cyc.find(curr) != cyc.end()) {
    imp = 1;
    return;
  }
  cyc.insert(curr);
  if (mm[curr].visit == 0) {
    if (mm[curr].ss.size() == 0) {
      topo.push_back(curr);
      mm[curr].visit = 1;
    } else {
      set<char>::iterator sit;
      for (sit = mm[curr].ss.begin(); sit != mm[curr].ss.end(); ++sit) {
        dfs(mm, (*sit), topo, cyc, imp);
        mm[curr].visit = 1;
      }
      mm[curr].visit = 1;
      topo.push_back(curr);
    }
  }
  return;
}
int main() {
  long long n;
  cin >> n;
  map<char, node> mm;
  pair<char, node> pp;
  node nd;
  set<char> mys;
  nd.visit = 0;
  for (long long i = (long long)'a'; i <= (long long)'z'; i++) {
    pp = make_pair((char)i, nd);
    mm.insert(pp);
  }
  vector<string> v(n);
  for (long long i = 0; i < n; i++) {
    cin >> v[i];
  }
  vector<char> query_order;
  for (long long i = 0; i < n - 1; i++) {
    long long oo = min(v[i].length(), v[i + 1].length());
    long long g = 0;
    while (g < oo) {
      if (v[i][g] != v[i + 1][g]) {
        query_order.push_back(v[i][g]);
        mm[v[i][g]].ss.insert(v[i + 1][g]);
        g = oo;
      }
      g += 1;
    }
    if (g == oo) {
      if (v[i].size() > v[i + 1].size()) {
        cout << "Impossible" << '\n';
        return 0;
      }
    }
  }
  vector<char> topo;
  bool imp = 0;
  set<char> cyc;
  for (long long i = 0; i < query_order.size(); i++) {
    dfs(mm, query_order[i], topo, cyc, imp);
  }
  reverse(topo.begin(), topo.end());
  map<char, node>::iterator mit;
  for (mit = mm.begin(); mit != mm.end(); ++mit) {
    set<char>::iterator sit;
    dfs(mm, mit->first, topo, cyc, imp);
  }
  if (imp == 1) {
    cout << "Impossible" << '\n';
    return 0;
  }
  for (long long i = 0; i < topo.size(); i++) {
    cout << topo[i];
  }
  cout << '\n';
  return 0;
}
