#include
#include
#include
#include
#include
#include
#include
//#include
using namespace std;
vectors;
int n;
vector > words[1005];
int dp[10005];
bool compare_two_strings(string &A, string &B) {
return true;
}
int backtrack[10005];
int dinamicko(int i){
if(i==n){
backtrack[i] = -1;
return 0;
}
if(dp[i] != -1) {
return dp[i];
}
int result=-1;
int next_index = -1;
vector cntA(26, 0);
for(int j = 0; j < s[i].size(); j++) {
cntA[s[i][j] - 'A']++;
}
int k = s[i].size();
for(int j = 0; j < words[k + 1].size(); j++) {
vector cntB(26, 0);
for(int l = 0; l cntB[l]) {
ok = false;
break;
}
}
if(!ok) continue;
int tmp = dinamicko(words[k + 1][j].second) + 1;
if(tmp > result) {
result = tmp;
next_index = words[k + 1][j].second;
}
}
if(next_index != -1)
backtrack[i] = next_index;
return dp[i] = result;
}
int main()
{
ios_base::sync_with_stdio(false);
// ifstream cin("input.txt");
memset(dp, -1, sizeof dp);
cin>>n;
for(int i=0; i>a;
// sort(a.begin(), a.end());
s.push_back(a);
words[(int) a.size()].push_back(make_pair(a, i));
}
// sort(s.begin(), s.end());
memset(backtrack, -1, sizeof backtrack);
int result = 0;
int START = 0;
for(int i = 0; i < n; i++) {
int tmp = dinamicko(i) + 1;
if(result < tmp) {
result = tmp;
START = i;
}
}
if(result <= 1) {
cout << 1 << endl;
cout << s[0][0] << endl;
return 0;
}
set st;
string p = "";
p += s[START][0];
vector ret;
ret.push_back(p);
if(s[START].size() == 1) {
ret.erase(ret.begin());
}
st.insert(p);
while(START != -1) {
st.insert(s[START]);
ret.push_back(s[START]);
START = backtrack[START];
}
if(ret[0].size() != ret[1].size() - 1) {
cout << 1 << "\nA";
return 0;
}
cout << st.size() << endl;
for(string x : ret) {
cout << x << endl;
}
return 0;
}