#include
#include
#include
using namespace std;
int n;
pair > v[10005];
vector, vector > > g[1005];
int dp[10005];
int backtrack[10005];
int f(int at)
{
if(dp[at] != -1) {
return dp[at];
}
int result = 0;
int sz = (int) v[at].first.size();
int max_result = 0;
for(int i = 0; i < (int) g[sz + 1].size(); i++) {
string tmp = g[sz + 1][i].first.first;
vector cnt1 = v[at].second;
vector cnt2 = g[sz + 1][i].second;
bool flag = false, ok = true;
for(int j = 0; j < 26; j++) {
if(abs(cnt1[j] - cnt2[j]) == 1 and !flag) {
flag = true;
continue;
}
if(abs(cnt1[j] - cnt2[j]) > 0) {
ok = false;
break;
}
}
if(ok) {
result = f(g[sz + 1][i].first.second) + 1;
if(result > max_result) {
max_result = result;
backtrack[at] = g[sz + 1][i].first.second;
}
}
}
return dp[at] = max_result;
}
int main()
{
ios_base::sync_with_stdio(false);
memset(dp, -1, sizeof dp);
memset(backtrack, -1, sizeof backtrack);
cin>>n;
for(int i = 0; i < n; i++) {
cin >>v[i].first;
vector cnt(26, 0);
for(int j = 0; j < (int) v[i].first.size(); j++) {
cnt[v[i].first[j] - 'A']++;
}
v[i].second = cnt;
g[(int)v[i].first.size()].emplace_back(make_pair(make_pair(v[i].first, i), cnt));
}
int result = 0, idx = 0;
for(int i = 0; i < n; i++) {
if((int) v[i].first.size() <= 2 and f(i) + 1 > result) {
result = f(i) + 1;
idx = i;
}
}
if(result <= 1) {
cout << 1 << endl;
cout << "A" << endl;
return 0;
}
vector answer;
answer.push_back(string() + v[idx].first[0]);
if(v[idx].first.size() != 1) {
answer.push_back(v[idx].first);
}
idx = backtrack[idx];
while(idx != -1) {
answer.push_back(v[idx].first);
idx = backtrack[idx];
}
cout << answer.size() << endl;
for(int i =0 ; i < (int) answer.size(); i++) {
cout << answer[i] << "\n";
}
return 0;
}