#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-9;
const int INF = 1E9;
const int MAXN = 800500;
const int ALPH = 26;
int n, take;
int root = 0, sz;
int nxt[MAXN][ALPH], num[MAXN][ALPH], pos[MAXN][2], ans;
vector<int> ids[MAXN][2];
vector<pair<int, int> > bij;
string s;
void dfs0(int v) {
  for (int i = 0; i < (int)(2); i++) {
    int ptake = pos[take][i];
    for (auto z : ids[v][i]) ids[ptake][i].push_back(z);
    ids[v][i].clear();
  }
  for (int i = 0; i < (int)(ALPH); i++)
    if (nxt[v][i] != -1) {
      int w = nxt[v][i];
      dfs0(w);
    }
}
void dfs(int v, int h) {
  for (int i = 0; i < (int)(ALPH); i++)
    if (nxt[v][i] != -1) {
      int w = nxt[v][i];
      if (num[w][0] >= 1 && num[w][1] >= 1) {
        dfs(w, h + 1);
        for (int id = 0; id < (int)(2); id++) {
          int pv = pos[v][id], pw = pos[w][id];
          if (ids[pv][id].size() > ids[pw][id].size()) {
            for (auto z : ids[pw][id]) ids[pv][id].push_back(z);
            ids[pw][id].clear();
            pos[w][id] = pv;
          } else {
            for (auto z : ids[pv][id]) ids[pw][id].push_back(z);
            ids[pv][id].clear();
            pos[v][id] = pw;
          }
        }
      } else {
        take = v;
        dfs0(w);
      }
    }
  int pv[2];
  pv[0] = pos[v][0];
  pv[1] = pos[v][1];
  while (!(ids[pv[0]][0].empty() || ids[pv[1]][1].empty())) {
    ans += h;
    bij.push_back({ids[pv[0]][0].back(), ids[pv[1]][1].back()});
    ids[pv[0]][0].pop_back();
    ids[pv[1]][1].pop_back();
  }
}
int main() {
  for (int i = 0; i < (int)(ALPH); i++) nxt[root][i] = -1;
  sz = 1;
  cin >> n;
  for (int i = 0; i < (int)(2); i++) {
    for (int j = 0; j < (int)(n); j++) {
      cin >> s;
      int v = root;
      num[v][i]++;
      for (int k = 0; k < (int)(s.size()); k++) {
        if (nxt[v][s[k] - 'a'] == -1) {
          nxt[v][s[k] - 'a'] = sz;
          for (int l = 0; l < (int)(ALPH); l++) nxt[sz][l] = -1;
          sz++;
        }
        v = nxt[v][s[k] - 'a'];
        num[v][i]++;
      }
      ids[v][i].push_back(j);
    }
  }
  for (int i = 0; i < (int)(sz); i++)
    for (int id = 0; id < (int)(2); id++) pos[i][id] = i;
  ans = 0;
  dfs(root, 0);
  cout << ans << '\n';
  for (int i = 0; i < (int)(bij.size()); i++)
    printf("%d %d\n", bij[i].first + 1, bij[i].second + 1);
  return 0;
}
