#include <bits/stdc++.h>
using namespace std;
namespace Stand_IO_Operation {
inline int read() {
  int f = 1, res = 0, ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') res = res * 10 + ch - 48, ch = getchar();
  return f * res;
}
int _sta[1 << 8];
inline void write(int val) {
  if (!val) {
    putchar('0');
    return;
  }
  if (val < 0) putchar('-'), val = -val;
  *_sta = 0;
  while (val > 0) _sta[++*_sta] = val % 10, val /= 10;
  for (int i = *_sta, _Lim = 1; i >= _Lim; i--) putchar(_sta[i] + 48);
}
};  // namespace Stand_IO_Operation
using namespace Stand_IO_Operation;
int son[800005][26], cnt;
vector<int> val[800005][2];
vector<pair<int, int> > ans;
int n, total;
bool vis[100005][2];
char ch[800005];
void insert(int id, int v) {
  int k = 0, len = strlen(ch + 1);
  val[k][id].push_back(v);
  for (int i = 1; i <= len; i++) {
    int x = ch[i] - 'a';
    if (son[k][x] == 0) son[k][x] = ++cnt;
    k = son[k][x];
    val[k][id].push_back(v);
  }
}
void dfs(int x, int dep) {
  for (int i = 0; i < 26; i++)
    if (son[x][i] != 0) dfs(son[x][i], dep + 1);
  vector<int>& name = val[x][0];
  vector<int>& pse = val[x][1];
  int a, b;
  for (int i = 0; i < name.size(); i++) {
    a = name[i];
    if (vis[a][0]) continue;
    for (int j = 0; j < pse.size(); j++) {
      b = pse[j];
      if (vis[b][1]) continue;
      vis[a][0] = vis[b][1] = true;
      ans.push_back(make_pair(a, b));
      total += dep;
      break;
    }
  }
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    scanf("%s", ch + 1);
    insert(0, i);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s", ch + 1);
    insert(1, i);
  }
  dfs(0, 0);
  write(total);
  puts("");
  for (int i = 0; i < n; i++) {
    write(ans[i].first);
    putchar(' ');
    write(ans[i].second);
    puts("");
  }
  return 0;
}
