#include <bits/stdc++.h>
using namespace std;
long long GCD(long long a, long long b) {
  if (b == 0) return a;
  return (a % b == 0 ? b : GCD(b, a % b));
}
long long POW(long long base, long long exp) {
  long long val;
  val = 1;
  while (exp > 0) {
    if (exp % 2 == 1) {
      val = (val * base) % 1000000007;
    }
    base = (base * base) % 1000000007;
    exp = exp / 2;
  }
  return val;
}
int res[30][30];
int used[30];
int main() {
  int n, i, j, k, sz1, sz2, flag, idx, prob;
  scanf("%d", &n);
  vector<string> v(n);
  string ans;
  for (i = 0; i < n; i++) {
    cin >> v[i];
  }
  for (i = 1; i < n; i++) {
    sz1 = v[i - 1].size();
    sz2 = v[i].size();
    flag = 0;
    for (j = 0; j < min(sz1, sz2); j++) {
      if (v[i - 1][j] != v[i][j]) {
        res[v[i][j] - 'a'][v[i - 1][j] - 'a'] = 1;
        flag = 1;
        break;
      }
    }
    if (flag == 0) {
      if (sz1 > sz2) {
        printf("Impossible\n");
        return 0;
      }
    }
  }
  flag = 0;
  for (i = 0; i < 26; i++) {
    idx = -1;
    for (j = 0; j < 26; j++) {
      if (used[j] == 1) continue;
      prob = 0;
      for (k = 0; k < 26; k++) {
        prob = prob + res[j][k];
      }
      if (prob == 0) {
        idx = j;
        break;
      }
    }
    if (idx == -1) {
      flag = 1;
      break;
    }
    ans.push_back('a' + idx);
    used[idx] = 1;
    for (j = 0; j < 26; j++) {
      res[j][idx] = 0;
    }
  }
  if (flag == 0) {
    cout << ans << endl;
  } else {
    printf("Impossible\n");
  }
  return 0;
}
