#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
using namespace std;
namespace ywy {
vector<char> vec[100010];
int lsh[100010];
vector<int> chi[100010][5];
inline void print(int x) {
  for (register int i = 0; i < vec[x].size(); i++) putchar(vec[x][i]);
}
char str[1000011];
int tab[300];
int ints[100010];
int que[1000001];
vector<int> veca, vecb;
void ywymain() {
  memset(tab, -1, sizeof(tab));
  tab['a'] = 0;
  tab['e'] = 1;
  tab['i'] = 2;
  tab['o'] = 3;
  tab['u'] = 4;
  int n;
  cin >> n;
  for (register int i = 1; i <= n; i++) {
    int tot = 0;
    scanf("%s", str + 1);
    int len = strlen(str + 1);
    for (register int j = 1; j <= len; j++) {
      vec[i].push_back(str[j]);
      tot += (tab[str[j]] != -1);
    }
    lsh[i] = ints[i] = tot;
  }
  sort(lsh + 1, lsh + 1 + n);
  int ptr = unique(lsh + 1, lsh + 1 + n) - lsh - 1;
  for (register int i = 1; i <= n; i++) {
    int lst = 0;
    for (register int j = 0; j < vec[i].size(); j++) {
      if (tab[vec[i][j]] != -1) lst = tab[vec[i][j]];
    }
    chi[lower_bound(lsh + 1, lsh + 1 + ptr, ints[i]) - lsh][lst].push_back(i);
  }
  int head = 0, tail = 0;
  for (register int i = 1; i <= ptr; i++) {
    int lst = -1;
    for (register int j = 0; j < 5; j++) {
      if (chi[i][j].size() & 1) {
        if (lst != -1) {
          que[tail] = lst;
          tail++;
          que[tail] = chi[i][j].back();
          tail++;
          chi[i][j].pop_back();
          lst = -1;
        } else
          lst = chi[i][j].back(), chi[i][j].pop_back();
      }
    }
  }
  for (register int i = 1; i <= ptr; i++) {
    for (register int j = 0; j < 5; j++) {
      if (chi[i][j].size() & 1) chi[i][j].pop_back();
      if (!chi[i][j].size()) continue;
      while (head < tail && chi[i][j].size()) {
        veca.push_back(que[head]);
        head++;
        vecb.push_back(chi[i][j].back());
        chi[i][j].pop_back();
        veca.push_back(que[head]);
        head++;
        vecb.push_back(chi[i][j].back());
        chi[i][j].pop_back();
      }
      if (chi[i][j].size()) {
        while (chi[i][j].size() > 2) {
          veca.push_back(chi[i][j].back());
          chi[i][j].pop_back();
          vecb.push_back(chi[i][j].back());
          chi[i][j].pop_back();
          veca.push_back(chi[i][j].back());
          chi[i][j].pop_back();
          vecb.push_back(chi[i][j].back());
          chi[i][j].pop_back();
        }
        if (chi[i][j].size()) {
          que[tail] = chi[i][j][0];
          tail++;
          que[tail] = chi[i][j][1];
          tail++;
        }
      }
    }
  }
  cout << veca.size() / 2 << endl;
  for (register int i = 0; i < veca.size(); i++) {
    print(veca[i]);
    putchar(' ');
    print(vecb[i]);
    cout << endl;
  }
}
}  // namespace ywy
int main() {
  ywy::ywymain();
  return (0);
}
