#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N * 10;
int rd() {
  int x = 0, w = 1;
  char ch = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * w;
}
int n, m;
char cc[M];
string ss[N];
int a[M][5];
vector<int> ls[M][5];
struct node {
  int x, y;
};
int res[M], to[128];
vector<node> c1, c2;
int main() {
  memset(to, -1, sizeof(to));
  to['a'] = 0;
  to['e'] = 1;
  to['i'] = 2;
  to['o'] = 3;
  to['u'] = 4;
  n = rd();
  for (int i = 1; i <= n; ++i) {
    scanf("%s", cc);
    int len = strlen(cc);
    int cn = 0, la = 0;
    for (int j = 0; j < len; ++j) {
      ss[i].push_back(cc[j]);
      if (to[(int)cc[j]] >= 0) ++cn, la = to[(int)cc[j]];
    }
    m = max(m, cn);
    if (cn) ++a[cn][la], ls[cn][la].push_back(i);
  }
  for (int i = 1; i <= m; ++i)
    for (int j = 0; j <= 4; ++j) {
      if (!a[i][j]) continue;
      while (a[i][j] > 1) {
        int xx = ls[i][j][a[i][j] - 1], yy = ls[i][j][a[i][j] - 2];
        c1.push_back((node){xx, yy});
        --a[i][j], --a[i][j];
        ls[i][j].pop_back();
        ls[i][j].pop_back();
      }
      if (a[i][j]) {
        if (res[i])
          c2.push_back((node){res[i], ls[i][j][0]}), res[i] = 0;
        else
          res[i] = ls[i][j][0];
      }
    }
  int nn = c1.size(), mm = c2.size();
  int ta = min((nn + mm) / 2, nn);
  printf("%d\n", ta);
  while (ta--) {
    node st, en;
    en = c1[nn - 1];
    --nn, c1.pop_back();
    if (mm) {
      st = c2[mm - 1];
      --mm, c2.pop_back();
    } else {
      st = c1[nn - 1];
      --nn, c1.pop_back();
    }
    cout << ss[st.x] << " " << ss[en.x] << endl
         << ss[st.y] << " " << ss[en.y] << endl;
  }
  return 0;
}
