#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];
vector<int> adj[maxNode];
int dist[maxNode];
int pa[maxNode];
bool avoid[maxNode];
char val[maxNode];
int max_dist = -1;
int node = 0;
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.back();
}
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 (auto v : adj[u]) {
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);
string cur = "";
for (int i = 0; i < s.size(); i++) {
insert(cur + s[i]);
int root = query(cur), child = query(cur + s[i]);
adj[root].emplace_back(child);
pa[child] = root;
cur.push_back(s[i]);
}
isWord[query(s)] = 1;
}
queue<int> q;
q.emplace(1);
int ct = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto v : adj[u]) {
dist[v] = dist[u] + 1;
q.emplace(v);
}
}
for (int i = 1; i < nextNode; i++) {
if (dist[i] > max_dist) {
max_dist = dist[i];
node = i;
}
}
cout << (nextNode - 2) * 2 - max_dist + n << "\n";
int cur = node;
while (cur != 1) {
avoid[cur] = 1;
cur = pa[cur];
}
solve(1);
}