#include <bits/stdc++.h>
using namespace std;
const int M = 1e9 + 7;
long long qpow(long long x, long long k) {
  return k == 0 ? 1 : 1ll * qpow(1ll * x * x % M, k >> 1) * (k & 1 ? x : 1) % M;
}
string a[100005];
vector<int> mp[100005][6];
vector<int> sec[100005];
map<char, int> rec;
struct lyric {
  string a, b, c, d;
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  rec['a'] = 0;
  rec['e'] = 1;
  rec['i'] = 2;
  rec['o'] = 3;
  rec['u'] = 4;
  rec['*'] = 5;
  for (int i = 0; i < n; i++) cin >> a[i];
  int mc = 0;
  for (int i = 0; i < n; i++) {
    string s = a[i];
    char lv = '*';
    int cnt = 0;
    for (int j = 0; j < s.length(); j++) {
      if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' ||
          s[j] == 'u') {
        cnt++;
        lv = s[j];
      }
    }
    mc = max(mc, cnt);
    mp[cnt][rec[lv]].push_back(i);
  }
  vector<pair<int, int> > comp, semi;
  for (int i = 0; i <= mc; i++) {
    for (int j = 0; j < 6; j++) {
      for (int k = 1; k < mp[i][j].size(); k += 2)
        comp.push_back({mp[i][j][k - 1], mp[i][j][k]});
      if (mp[i][j].size() & 1) {
        sec[i].push_back(*mp[i][j].rbegin());
      }
    }
  }
  for (int i = 0; i <= mc; i++) {
    for (int j = 1; j < sec[i].size(); j += 2)
      semi.push_back({sec[i][j - 1], sec[i][j]});
  }
  vector<lyric> ans;
  for (int i = 0; i < min(comp.size(), semi.size()); i++) {
    lyric l;
    l.a = a[semi[i].first];
    l.b = a[comp[i].first];
    l.c = a[semi[i].second];
    l.d = a[comp[i].second];
    ans.push_back(l);
  }
  if (comp.size() > semi.size()) {
    for (int i = semi.size() + 1; i < comp.size(); i += 2) {
      lyric l;
      l.a = a[comp[i].first];
      l.b = a[comp[i - 1].first];
      l.c = a[comp[i].second];
      l.d = a[comp[i - 1].second];
      ans.push_back(l);
    }
  }
  cout << ans.size() << endl;
  for (auto it : ans) {
    cout << it.a << " " << it.b << endl << it.c << " " << it.d << endl;
  }
}
