int n;
struct Word
{
string word;
int num;
char last;
bool operator < (const Word& that) const
{
if (this->num != that.num)
return this->num < that.num;
return this->last < that.last;
}
}words[MAXN];
int main()
{
cin >> n;
for (int i = 1;i <= n;i++)
{
cin >> words[i].word;
for (auto c:words[i].word)
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
words[i].num++,words[i].last = c;
}
sort(words+1, words+1+n);
vector<pair<int, int> > fi, se;
int pos = 1,w = -1, cnt = 1;
while(pos <= n)
{
if (words[pos].num == words[pos+1].num && words[pos].last == words[pos+1].last)
se.push_back(make_pair(pos, pos+1)),pos += 2;
else if (words[pos].num != cnt)
w = pos,cnt = words[pos].num,pos++;
else if (w == -1)
w = pos,pos++;
else
fi.push_back(make_pair(w, pos)),w = -1,pos++;
}
int s1 = fi.size(), s2 = se.size(),res = 0;
res += min(s1, s2) + max(0, (s2-s1)/2);
cout << res << endl;
int i;
for (i = 0;i < min(fi.size(), se.size());i++)
{
cout << words[fi[i].first].word << ' ' << words[se[i].first].word << endl;
cout << words[fi[i].second].word << ' ' << words[se[i].second].word << endl;
}
for (;i+1 < se.size();i+=2)
{
cout << words[se[i].first].word << ' ' << words[se[i+1].first].word << endl;
cout << words[se[i].second].word << ' ' << words[se[i+1].second].word << endl;
}
//stop;
return 0;
}