#include <bits/stdc++.h>   using namespace std;   struct myhash {     static uint64_t splitmix64(uint64_t x) {       x += 0x9e3779b97f4a7c15;       x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;       x = (x ^ (x >> 27)) * 0x94d049bb133111eb;       return x ^ (x >> 31);     }     size_t operator()(uint64_t x) const {       static const uint64_t FIXED_RANDOM =           chrono::steady_clock::now().time_since_epoch().count();       return splitmix64(x + FIXED_RANDOM);     }   };   long long modpow(long long base, long long exp, long long modulus) {     base %= modulus;     long long result = 1;     while (exp > 0) {       if (exp & 1) result = (result * base) % modulus;       base = (base * base) % modulus;       exp >>= 1;     }     return result;   }   long long modinv(long long a, long long m) {     long long m0 = m;     long long y = 0, x = 1;     if (m == 1) return 0;     while (a > 1) {       long long q = a / m;       long long t = m;       m = a % m, a = t;       t = y;       y = x - q * y;       x = t;     }     if (x < 0) x += m0;     return x;   }   int main() {     long long n;     cin >> n;     vector<string> s(n);     for (long long(i) = (0); i < (n); ++(i)) cin >> s[i];     map<long long, unordered_map<char, vector<string>>> m;     vector<pair<string, string>> secondwords(0);     vector<vector<string>> firstwords(0);     unordered_map<long long, long long> fq;     vector<long long> poss(0);     for (long long(i) = (0); i < (n); ++(i)) {       char lastvowel;       long long numvowels = 0;       for (long long(j) = (0); j < (s[i].length()); ++(j)) {         switch (s[i][j]) {           case  a :           case  e :           case  i :           case  o :           case  u :             numvowels++;             lastvowel = s[i][j];             break;         }       }       if (!fq[numvowels]) {         fq[numvowels] = 1;         poss.push_back(numvowels);       }       m[numvowels][lastvowel].push_back(s[i]);     }     vector<char> st{ a ,  e ,  i ,  o ,  u };     for (long long(i) = (0); i < (poss.size()); ++(i)) {       vector<string> ones(0);       for (long long(j) = (0); j < (st.size()); ++(j)) {         for (long long(k) = (0); k < (m[poss[i]][st[j]].size() / 2); ++(k)) {           secondwords.push_back(               {m[poss[i]][st[j]][k * 2], m[poss[i]][st[j]][k * 2 + 1]});         }         if (m[poss[i]][st[j]].size() % 2 == 1) {           ones.push_back(m[poss[i]][st[j]][m[poss[i]][st[j]].size() - 1]);         }       }       firstwords.push_back(ones);     }     long long np = secondwords.size();     vector<pair<string, string>> fans(0);     for (long long(i) = (0); i < (firstwords.size()); ++(i)) {       for (long long(j) = (0); j < (firstwords[i].size() / 2); ++(j)) {         fans.push_back({firstwords[i][j * 2], firstwords[i][j * 2 + 1]});       }     }     if (fans.size() >= secondwords.size()) {       cout << secondwords.size() <<   n ;       for (long long(i) = (0); i < (secondwords.size()); ++(i)) {         cout << fans[i].first <<     << secondwords[i].first <<   n ;         cout << fans[i].second <<     << secondwords[i].second <<   n ;       }     } else {       long long sc = secondwords.size(), fw = fans.size();       while (sc > fw) {         sc--;         fw++;         fans.push_back(secondwords[sc]);       }       cout << sc <<   n ;       for (long long(i) = (0); i < (sc); ++(i)) {         cout << fans[i].first <<     << secondwords[i].first <<   n ;         cout << fans[i].second <<     << secondwords[i].second <<   n ;       }     }   }