#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
using namespace std;
const int N = 1e6 + 5;
int n, p = 1, pa[N];
int ch[N][26];
vector<int> cnt[N][2];
vector<pair<int, int> > as;
long long ans;
inline void dfs(int u, int dep) {
  for (register int i = 0; i <= 25; ++i) {
    int v = ch[u][i];
    if (v) {
      dfs(v, dep + 1);
      for (register int j = 0; j < cnt[v][0].size(); ++j)
        cnt[u][0].push_back(cnt[v][0][j]);
      for (register int j = 0; j < cnt[v][1].size(); ++j)
        cnt[u][1].push_back(cnt[v][1][j]);
    }
  }
  ans += min(cnt[u][0].size(), cnt[u][1].size()) * dep;
  for (register int i = min(cnt[u][0].size(), cnt[u][1].size()) - 1; i > -1;
       --i) {
    as.push_back(
        {cnt[u][0][cnt[u][0].size() - 1], cnt[u][1][cnt[u][1].size() - 1]});
    cnt[u][0].pop_back();
    cnt[u][1].pop_back();
  }
}
string a;
int main() {
  cin >> n;
  for (register int id = 1; id <= n; ++id) {
    cin >> a;
    int u = 1;
    for (register int i = 0; i < a.size(); ++i) {
      int c = a[i] - 'a';
      if (ch[u][c] == 0) ch[u][c] = ++p;
      u = ch[u][c];
    }
    cnt[u][0].push_back(id);
  }
  for (register int id = 1; id <= n; ++id) {
    cin >> a;
    int u = 1;
    for (int i = 0; i < a.size(); ++i) {
      int c = a[i] - 'a';
      if (!ch[u][c]) ch[u][c] = ++p;
      u = ch[u][c];
    }
    cnt[u][1].push_back(id);
  }
  dfs(1, 0);
  printf("%d\n", ans);
  for (register int i = 0; i <= n - 1; ++i)
    printf("%d %d\n", as[i].first, as[i].second);
  return 0;
}
