#include
#include
#include
#include
#include
using namespace std;
int memo[10005];
int n;
vector, vector > > v;
int backtrack[10005];
int dp(int index){
if(index == n){
return 0;
}
if(memo[index] != -1){
return memo[index];
}
int res = 0;
vector a1;
vector b1;
for (int i = index+1; i < v.size() ; i++) {
if(v[i].first.first == v[index].first.first + 1){
bool ok = false;
bool moze = true;
a1 = v[i].second;
b1 = v[index].second;
for (int j = 0; j < 26; j++) {
if(a1[j] != b1[j] && ok == false){
if(abs(a1[j] - b1[j]) == 1){
ok = true;
}
else
moze = false;
}
else if(a1[j] != b1[j] && ok == true){
moze = false;
break;
}
}
if(moze){
if(res < dp(i) + 1) {
res = dp(i) + 1;
backtrack[index] = i;
}
}
}
}
return memo[index] = res;
}
int main()
{
cin >> n;
memset(backtrack, -1, sizeof backtrack);
for(int i = 0; i < n; i++) {
string s;
cin >> s;
vector cnt(26, 0);
for(int j = 0; j < s.size(); j++) {
cnt[s[j] - 'A']++;
}
v.push_back(make_pair(make_pair(s.size(), s), cnt));
}
sort(v.begin(), v.end());
memset(memo, -1,sizeof memo);
int result = 0, start_id = 0;
for(int i =0 ; i < n; i++) {
if(v[i].first.first == 2) {
if(result < dp(i)) {
result = dp(i) + 1;
start_id = i;
}
}
}
// cout << result << endl;
if(result <= 1) {
cout << 1 << "\n";
cout << "A" << endl;
return 0;
}
vector ans;
ans.push_back(string() + v[start_id].first.second[0]);
int A = start_id;
while(A != -1) {
ans.push_back(v[A].first.second);
A = backtrack[A];
}
if(ans[0].size() == ans[1].size()) {
ans.erase(ans.begin());
}
cout << ans.size() << "\n";
for(int i = 0; i < ans.size(); i++) {
cout << ans[i] << "\n";
}
return 0;
}