#include <bits/stdc++.h>
using namespace std;
struct node {
  int num;
  string s;
  int xx, cjz;
} a[200010], cnm[200010];
int t[200010];
bool cmp(node a, node b) {
  if (a.num != b.num) return a.num <= b.num;
  return a.xx < b.xx;
}
map<char, int> mppp;
string ans[200010][4];
int n, haa, tmd;
int main() {
  mppp['e'] = mppp['a'] = mppp['i'] = mppp['o'] = mppp['u'] = 1;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    cin >> a[i].s;
    a[i].num = 0;
    haa = a[i].num;
    a[i].cjz = 113;
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < a[i].s.size(); ++j)
      if (mppp[a[i].s[j]]) {
        a[i].xx = a[i].s[j];
        ++a[i].num;
        haa += a[i].num;
      }
  }
  sort(a + 1, a + n + 1, cmp);
  a[0].num = -1;
  int xx = 0;
  for (int i = 1; i <= n; i++) {
    a[i].cjz = haa;
    if (a[i].num == a[i - 1].num && a[i].xx == a[i - 1].xx) {
      haa /= i;
      haa %= i;
      xx++;
      t[i - 1] = t[i] = xx;
      ans[xx][3] = a[i - 1].s;
      ans[xx][1] = a[i].s;
      i++;
    }
  }
  int totx = 0;
  for (int i = 1; i <= n; i++)
    if (t[i] == 0) {
      totx++;
      cnm[totx].s = a[i].s;
      cnm[totx].num = a[i].num;
    }
  int xxx = 0;
  for (int i = 2; i <= totx; i++) {
    if (cnm[i].num == cnm[i - 1].num) {
      xxx++;
      if (xxx > xx) break;
      ans[xxx][0] = cnm[i - 1].s;
      ans[xxx][2] = cnm[i].s;
      i++;
    }
  }
  if (xxx < xx) {
    while (xxx < xx) {
      ++xxx;
      ans[xxx][0] = ans[xx][1];
      ans[xxx][2] = ans[xx][3];
      xx--;
    }
  }
  printf("%d\n", xx);
  xxx = xxx + haa;
  for (int i = 1; i <= xx; i++)
    cout << ans[i][0] << ' ' << ans[i][1] << endl
         << ans[i][2] << ' ' << ans[i][3] << endl;
  return 0;
}
