#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e9 + 10;
const int N = 1e6 + 10;
int match[N][2];
struct trie {
  int ch[N][26], sz[N][2], last;
  vector<int> leaf[N][2];
  trie() {
    memset(ch, 0, sizeof ch);
    memset(sz, 0, sizeof sz);
    last = 1;
  }
  void add(string s, int id, int tp) {
    int v = 1;
    for (int i = 0; i < s.size(); i++) {
      int c = s[i] - 'a';
      if (ch[v][c] == 0) {
        last++;
        ch[v][c] = last;
      }
      leaf[v][tp].push_back(id);
      sz[v][tp]++;
      v = ch[v][c];
    }
    sz[v][tp]++;
    leaf[v][tp].push_back(id);
  }
  void dfs(int v) {
    for (int c = 0; c < 26; c++)
      if (ch[v][c] != 0) dfs(ch[v][c]);
    vector<int> ve[2];
    for (int tp = 0; tp <= 1; tp++)
      for (auto x : leaf[v][tp])
        if (!match[x][tp]) ve[tp].push_back(x);
    for (int i = 0; i < min(ve[0].size(), ve[1].size()); i++) {
      match[ve[0][i]][0] = ve[1][i];
      match[ve[1][i]][1] = ve[0][i];
    }
  }
} trie;
string s[N], t[N];
signed main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> s[i];
    trie.add(s[i], i, 0);
  }
  for (int i = 1; i <= n; i++) {
    cin >> t[i];
    trie.add(t[i], i, 1);
  }
  trie.dfs(1);
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    int lcp = 0;
    for (int j = 0; j < min(s[i].size(), t[match[i][0]].size()); j++)
      if (s[i][j] == t[match[i][0]][j])
        lcp++;
      else
        break;
    ans += lcp;
  }
  cout << ans << "\n";
  for (int i = 1; i <= n; i++) cout << i << " " << match[i][0] << "\n";
}
