#include <bits/stdc++.h>
using namespace std;
bool search_cycle(vector<vector<int>> graph, int node, int color[]) {
  if (color[node] == 0) {
    color[node] = 1;
    for (auto it : graph[node]) {
      if (color[it] == 1) {
        return true;
      } else {
        if (search_cycle(graph, it, color)) return true;
      }
    }
    color[node] = 2;
  }
  return false;
}
void top_sort(vector<vector<int>> graph, int node, stack<int> &s, bool vis[]) {
  if (!vis[node]) {
    vis[node] = 1;
    for (auto it : graph[node]) {
      top_sort(graph, it, s, vis);
    }
    s.push(node);
  }
}
int find_combo(string s1, string s2, char &x, char &y) {
  int f = -1;
  char store[2];
  for (int i = 0; i < min(s1.size(), s2.size()); i++) {
    if (s1[i] != s2[i]) {
      store[0] = s1[i];
      store[1] = s2[i];
      f = 1;
      break;
    }
  }
  if (f == -1 && s1 > s2) {
    return -1;
  } else if (f == -1 && s1 <= s2) {
    return 0;
  } else {
    x = store[0];
    y = store[1];
    return 1;
  }
}
int main() {
  int t;
  cin >> t;
  vector<string> s(t);
  for (int i = 0; i < t; i++) {
    cin >> s[i];
  }
  vector<vector<int>> graph(30);
  for (int i = 0; i < t - 1; i++) {
    char u, v;
    int p = find_combo(s[i], s[i + 1], u, v);
    if (p == -1) {
      cout << "Impossible" << endl;
      return 0;
    } else if (p == 0)
      continue;
    else {
      graph[u - 'a'].push_back(v - 'a');
    }
  }
  int color[26] = {0};
  int f = 0;
  for (int i = 0; i < 26; i++) {
    if (color[i] == 0) {
      if (search_cycle(graph, i, color)) f = 1;
    }
  }
  if (f) {
    cout << "Impossible" << endl;
    return 0;
  }
  stack<int> st;
  bool vis[26] = {false};
  for (int i = 0; i < 26; i++) {
    if (!vis[i]) {
      top_sort(graph, i, st, vis);
    }
  }
  while (!st.empty()) {
    int topp = st.top();
    st.pop();
    cout << (char)(topp + 'a');
  }
}
