#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
void swap(long long *xp, long long *yp) {
  long long temp = *xp;
  *xp = *yp;
  *yp = temp;
}
const long long maxn = 1e5 + 1;
void print(vector<long long> v) {
  long long i, j, n = v.size();
  for (i = 0; i < n; i++) {
    cout << v[i] << " ";
  }
  cout << "\n";
}
void scan(vector<long long> &v, long long n) {
  for (long long i = 0; i < n; i++) cin >> v[i];
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
long long power(long long x, long long y) {
  long long res = 1;
  while (y > 0) {
    if (y & 1) res = (res * x) % mod;
    y = y / 2;
    x = (x * x) % mod;
  }
  return res % mod;
}
long long modinv(long long x) { return power(x, mod - 2) % mod; }
vector<bool> prime(maxn, true);
void sieve() {
  long long n = maxn;
  prime[0] = false;
  prime[1] = false;
  for (long long p = 2; p * p <= n; p++) {
    if (prime[p] == true) {
      for (long long i = p * p; i <= n; i += p) prime[i] = false;
    }
  }
}
vector<long long> adj[27];
vector<long long> color(26, 0);
bool cycle = false;
vector<long long> an;
void dfs(long long root) {
  color[root] = 1;
  for (auto child : adj[root]) {
    if (color[child] == 1) {
      cycle = true;
    } else if (color[child] == 0) {
      dfs(child);
    }
  }
  color[root] = 2;
  an.push_back(root);
}
int main() {
  long long int i, j, inc, dec, t, r;
  long long int c, d, e, temp, m, p, w, k, x, y, sum, pre, temp2, mid, n, low,
      high, ans;
  t = 1;
  n = 1;
  while (t--) {
    cin >> n;
    vector<string> a(n);
    for (i = 0; i < n; i++) {
      cin >> a[i];
    }
    bool flg2 = true;
    for (i = 0; i < n - 1; i++) {
      bool flg = false;
      for (j = 0; j < min(a[i].size(), a[i + 1].size()); j++) {
        if (a[i][j] != a[i + 1][j]) {
          flg = true;
          adj[a[i][j] - 'a'].push_back(a[i + 1][j] - 'a');
          break;
        }
      }
      if (!flg && a[i].size() > a[i + 1].size()) {
        flg2 = false;
        break;
      }
    }
    if (!flg2) {
      cout << "Impossible"
           << "\n";
      continue;
    }
    for (i = 0; i < 26; i++) {
      if (color[i] == 0) dfs(i);
    }
    if (cycle) {
      cout << "Impossible"
           << "\n";
      continue;
    }
    reverse((an).begin(), (an).end());
    string s = "";
    for (i = 0; i < an.size(); i++) {
      s.push_back(an[i] + 'a');
    }
    cout << s << "\n";
  }
  return 0;
}
