#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int nx = 25005;
const int maxNode = nx * 25;
int nextNode = 2;
vector<string> str;
int n;
int trie[maxNode][26];
bool isWord[maxNode];
bool avoid[maxNode];
char val[maxNode];
int max_dist = -1;
string node = "";
void insert(string s) {
int cur = 1;
for (int i = 0; i < s.size(); i++) {
int state = s[i] - 'a';
if (trie[cur][state] == 0) {
trie[cur][state] = nextNode++;
}
cur = trie[cur][state];
val[cur] = s[i];
}
}
int query(string s) {
int cur = 1;
for (int i = 0; i < s.size(); i++) {
cur = trie[cur][s[i]-'a'];
}
return cur;
}
bool vis = 0;
void solve(int u) {
if (u != 1) cout << val[u] << "\n";
if (isWord[u]) cout << "P\n";
int visit_after = -1;
for (int i = 0; i < 26; i++) {
int v = trie[u][i];
if (v == 0) continue;
if (avoid[v]) {
visit_after = v;
continue;
}
solve(v);
if (vis) return;
cout << "-\n";
}
if (visit_after != -1) solve(visit_after);
}
int main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
str.emplace_back(s);
insert(s);
isWord[query(s)] = 1;
if (max_dist < (int)s.size()) {
max_dist = s.size();
node = s;
//cout << "cum\n";
}
//cout << s.size() << " " << max_dist << " " << node << " \n";
}
int cur = 1;
for (int i = 0; i < node.size(); i++) {
cur = trie[cur][node[i]-'a'];
avoid[cur] = 1;
}
//cout << nextNode << " " << max_dist << " " << node << endl;
cout << (nextNode - 2) * 2 - max_dist + n << "\n";
solve(1);
}