#include <bits/stdc++.h>
using namespace std;
class TopologicalSort {
 public:
  static const int MV = 100;
  int NV, NIE[MV];
  vector<int> OutEdge[MV];
  TopologicalSort(int nv) { init(nv); }
  void init(int nv) {
    NV = nv;
    for (int i = 0; i < NV; i++) OutEdge[i].clear(), NIE[i] = 0;
  }
  void add_edge(int x, int y) {
    OutEdge[x].push_back(y);
    NIE[y]++;
  }
  vector<int> sort() {
    int i, nv = 0;
    vector<int> NI, R;
    NI.reserve(NV);
    R.reserve(NV);
    queue<int> S;
    for (i = 0; i < NV; i++) {
      NI.push_back(NIE[i]);
      nv += OutEdge[i].size();
      if (NIE[i] == 0) S.push(i);
    }
    while (!S.empty()) {
      int cur = S.front();
      S.pop();
      R.push_back(cur);
      for (__typeof(OutEdge[cur].begin()) it = OutEdge[cur].begin();
           it != OutEdge[cur].end(); it++) {
        nv--;
        if (--NI[*it] == 0) S.push(*it);
      }
    }
    if (nv) return vector<int>();
    return R;
  }
};
int N;
string S[1010];
int mat[27][27];
void solve() {
  int i, j, k, l, r, x, y;
  string s;
  cin >> N;
  for (i = 0; i < N; i++) cin >> S[i];
  for (i = 0; i < N - 1; i++) {
    bool hoge = false;
    for (j = 0; j < min(S[i].size(), S[i + 1].size()); j++) {
      if (S[i][j] != S[i + 1][j]) {
        mat[S[i][j] - 'a'][S[i + 1][j] - 'a'] = 1;
        hoge = true;
        break;
      }
    }
    if (hoge == false && S[i].size() > S[i + 1].size())
      return (void)printf("Impossible\n");
  }
  TopologicalSort ts(26);
  for (i = 0; i < 26; i++)
    for (j = 0; j < 26; j++)
      if (mat[i][j]) ts.add_edge(i, j);
  vector<int> v = ts.sort();
  if (v.empty()) {
    (void)printf("Impossible\n");
  } else {
    for (i = 0; i < 26; i++) (void)printf("%c", 'a' + v[i]);
    (void)printf("\n");
  }
}
int main(int argc, char** argv) {
  string s;
  int i;
  if (argc == 1) ios::sync_with_stdio(false);
  for (i = 0; i < argc - 1; i++) s += argv[i + 1], s += '\n';
  for (i = 0; i < s.size(); i++) ungetc(s[s.size() - 1 - i], stdin);
  solve();
  return 0;
}
