#include <bits/stdc++.h>
using namespace std;
class Graph {
  int V;
  list<int> *adj;
  void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
  bool isCyclicUtil(int v, bool visited[], bool *rs);

 public:
  Graph(int V);
  void addEdge(int v, int w);
  void topologicalSort();
  bool isCyclic();
};
Graph::Graph(int V) {
  this->V = V;
  adj = new list<int>[V];
}
void Graph::addEdge(int v, int w) { adj[v].push_back(w); }
void Graph::topologicalSortUtil(int v, bool visited[], stack<int> &Stack) {
  visited[v] = true;
  list<int>::iterator i;
  for (i = adj[v].begin(); i != adj[v].end(); ++i)
    if (!visited[*i]) topologicalSortUtil(*i, visited, Stack);
  Stack.push(v);
}
void Graph::topologicalSort() {
  stack<int> Stack;
  bool *visited = new bool[V];
  for (int i = 0; i < V; i++) visited[i] = false;
  for (int i = 0; i < V; i++)
    if (visited[i] == false) topologicalSortUtil(i, visited, Stack);
  while (Stack.empty() == false) {
    cout << (char)('a' + Stack.top());
    Stack.pop();
  }
}
bool Graph::isCyclicUtil(int v, bool visited[], bool *recStack) {
  if (visited[v] == false) {
    visited[v] = true;
    recStack[v] = true;
    list<int>::iterator i;
    for (i = adj[v].begin(); i != adj[v].end(); ++i) {
      if (!visited[*i] && isCyclicUtil(*i, visited, recStack))
        return true;
      else if (recStack[*i])
        return true;
    }
  }
  recStack[v] = false;
  return false;
}
bool Graph::isCyclic() {
  bool *visited = new bool[V];
  bool *recStack = new bool[V];
  for (int i = 0; i < V; i++) {
    visited[i] = false;
    recStack[i] = false;
  }
  for (int i = 0; i < V; i++)
    if (isCyclicUtil(i, visited, recStack)) return true;
  return false;
}
int main() {
  long long int n;
  cin >> n;
  string s[n];
  for (long long int i = 0; i < n; i++) {
    cin >> s[i];
  }
  map<char, long long int> m;
  vector<vector<char> > v;
  vector<char> b;
  v.push_back(b);
  for (long long int i = 0; i < n;) {
    if (m[s[i][0]] == 0) {
      v[0].push_back(s[i][0]);
      m[s[i][0]] = 1;
    } else {
      cout << "Impossible";
      return 0;
    }
    string ss = s[i];
    i++;
    while (i < n && s[i][0] == ss[0]) {
      vector<char> vv;
      for (long long int j = 0; j < ss.length(); j++) {
        if (j == s[i].length()) {
          cout << "Impossible";
          return 0;
        }
        if (s[i][j] != ss[j]) {
          vv.push_back(ss[j]);
          vv.push_back(s[i][j]);
          break;
        }
      }
      v.push_back(vv);
      ss = s[i];
      i++;
    }
  }
  Graph g(26);
  for (long long int i = 0; i < v.size(); i++) {
    for (long long int j = 1; j < v[i].size(); j++) {
      g.addEdge(v[i][j - 1] - 'a', v[i][j] - 'a');
    }
  }
  if (g.isCyclic()) {
    cout << "Impossible";
    return 0;
  }
  g.topologicalSort();
  cout << endl;
}
