#include <bits/stdc++.h>   using namespace std;   double tick() {     static clock_t oldtick;     clock_t newtick = clock();     double diff = 1.0 * (newtick - oldtick) / CLOCKS_PER_SEC;     oldtick = newtick;     return diff;   }   long long gcd(long long a, long long b) {     if ((a == 0) || (b == 0)) {       return a + b;     }     return gcd(b, a % b);   }   long long powMod(long long a, long long b) {     long long res = 1;     while (b) {       if (b & 1) res = (res * a) % 1000000007;       a = (a * a) % 1000000007;       b >>= 1;     }     return (res % 1000000007);   }   long long pow2(long long a, long long b) {     long long res = 1;     while (b) {       if (b & 1) res = (res * a);       a = (a * a);       b >>= 1;     }     return res;   }   bool isPrime(long long a) {     for (long long i = 3; (i * i) <= a; i += 2) {       if ((a % i) == 0) return false;     }     if ((a != 2) && ((a % 2) == 0)) {       return false;     }     if (a == 1) {       return false;     }     return true;   }   string conLlToStr(long long a) {     stringstream mystr;     mystr << a;     return mystr.str();   }   long long conStrToLl(string st) {     long long numb = 0;     long long len = st.size(), i, j = 0;     for (long long i = len - 1; i >= 0; i--) {       numb += (pow2(10, j) * (st[i] -  0 ));       j++;     }     return numb;   }   long long basenoToDecimal(string st, long long basee) {     long long i = 0, j, anss = 0;     for (long long j = (int)st.length() - 1; j >= 0; j--) {       anss += (st[j] -  0 ) * pow2(basee, i);       i++;     }     return anss;   }   string decimalToString(long long num, long long basee) {     long long i = 0, j, opop;     string anss =   ;     vector<string> stri;     stri.push_back( 0 );     stri.push_back( 1 );     stri.push_back( 2 );     stri.push_back( 3 );     stri.push_back( 4 );     stri.push_back( 5 );     stri.push_back( 6 );     stri.push_back( 7 );     stri.push_back( 8 );     stri.push_back( 9 );     stri.push_back( A );     stri.push_back( B );     stri.push_back( C );     stri.push_back( D );     stri.push_back( E );     stri.push_back( F );     if (num == 0) {       return  0 ;     }     while (num) {       opop = (num % basee);       anss += stri[opop];       num /= basee;     }     reverse(anss.begin(), anss.end());     return anss;   }   long long my_sqrt(long long x) {     long long y = (long long)(sqrtl((long double)x) + 0.5);     while (y * y < x) {       y++;     }     while (y * y > x) {       y--;     }     if (y * y == x) {       return y;     }     return -1;   }   long long my_crt(long long x) {     long long y = (long long)(powl((long double)x, 1.0 / 3.0) + 0.5);     while (y * y * y < x) {       y++;     }     while (y * y * y > x) {       y--;     }     if (y * y * y == x) {       return y;     }     return -1;   }   const int dx[] = {0, 1, 1, 1, 0, -1, -1, -1};   const int dy[] = {1, 1, 0, -1, -1, -1, 0, 1};   string S[100010];   vector<string> stringContained[100010][30];   vector<pair<string, string> > firstString, secondString;   vector<pair<pair<string, string>, pair<string, string> > > ans;   set<int> numVowel;   vector<string> temp;   bool isVowel(char ch) {     if (ch ==  a  || ch ==  e  || ch ==  i  || ch ==  o  || ch ==  u ) {       return 1;     }     return 0;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     int N;     cin >> N;     for (long long i = 1; i <= N; i++) {       cin >> S[i];       int vowel = 0;       char lastVowel;       for (long long j = 0; j <= (int)S[i].length() - 1; j++) {         if (isVowel(S[i][j])) {           vowel++;           lastVowel = S[i][j];         }       }       if (vowel) {         numVowel.insert(vowel);         stringContained[vowel][lastVowel -  a ].push_back(S[i]);       }     }     for (auto it = numVowel.begin(); it != numVowel.end(); ++it) {       int i = (*it);       for (long long j = 0; j <= 25; j++) {         for (int k = 0; k < (int)stringContained[i][j].size(); k += 2) {           if ((k + 1) < (int)stringContained[i][j].size()) {             secondString.push_back(make_pair(stringContained[i][j][k],                                              stringContained[i][j][k + 1]));           }         }         if (stringContained[i][j].size() % 2) {           temp.push_back(stringContained[i][j][stringContained[i][j].size() - 1]);         }       }       for (int k = 0; k < (int)temp.size(); k += 2) {         if ((k + 1) < (int)temp.size()) {           firstString.push_back(make_pair(temp[k], temp[k + 1]));         }       }       temp.clear();     }     int ind1 = 0, ind2 = 0;     while (ind1 < firstString.size() && ind2 < secondString.size()) {       ans.push_back(make_pair(           make_pair(firstString[ind1].first, secondString[ind2].first),           make_pair(firstString[ind1].second, secondString[ind2].second)));       ind1 += 1;       ind2 += 1;     }     for (int k = ind2; k < (int)secondString.size(); k += 2) {       if ((k + 1) < (int)secondString.size()) {         ans.push_back(make_pair(             make_pair(secondString[k].first, secondString[k + 1].first),             make_pair(secondString[k].second, secondString[k + 1].second)));       }     }     cout << ans.size() <<   n ;     for (long long i = 0; i <= (int)ans.size() - 1; i++) {       cout << ans[i].first.first <<     << ans[i].first.second <<   n ;       cout << ans[i].second.first <<     << ans[i].second.second <<   n ;     }     return 0;   }