#include <bits/stdc++.h>
using namespace std;
const int maxnode = 8e5 + 5;
int ch[800005][26], sz;
char str[800005];
bool vis[800005][2];
int match[800005];
vector<int> val[800005][2];
void init() {
  sz = 1;
  memset(ch[0], 0, sizeof(ch[0]));
}
void Insert(char *s, int id, int v) {
  int u = 0;
  int len = strlen(s);
  val[u][id].push_back(v);
  for (int i = 0; i < len; i++) {
    if (ch[u][s[i] - 'a'] == 0) {
      memset(ch[sz], 0, sizeof(ch[sz]));
      val[sz][id].clear();
      ch[u][s[i] - 'a'] = sz++;
    }
    u = ch[u][s[i] - 'a'];
    val[u][id].push_back(v);
  }
}
int dfs(int dep, int u) {
  int ans = 0;
  for (int i = 0; i < 26; i++)
    if (ch[u][i]) ans += dfs(dep + 1, ch[u][i]);
  vector<int> tmp[2];
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < val[u][i].size(); j++)
      if (!vis[val[u][i][j]][i]) tmp[i].push_back(val[u][i][j]);
  int num = min(tmp[0].size(), tmp[1].size());
  ans += dep * num;
  for (int i = 0; i < num; i++) {
    match[tmp[0][i]] = tmp[1][i];
    vis[tmp[0][i]][0] = vis[tmp[1][i]][1] = 1;
  }
  return ans;
}
int main(void) {
  int n;
  while (cin >> n) {
    init();
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++) scanf(" %s", str), Insert(str, 0, i);
    for (int i = 1; i <= n; i++) scanf(" %s", str), Insert(str, 1, i);
    printf("%d\n", dfs(0, 0));
    for (int i = 1; i <= n; i++) printf("%d %d\n", i, match[i]);
  }
  return 0;
}
