#include <bits/stdc++.h>
using namespace std;
const long long LINF = 1e18 + 5;
const int MOD = (int)1e9 + 7;
const int LOG = 18;
const int INF = 1e9;
const int N = 1e5 + 5;
const int M = 8e5 + 5;
const int SQ = 350;
char s[M];
int n, l, sz, cnt;
struct trie {
  int ed[26];
  vector<int> v[2];
} T[N * 10];
vector<pair<int, int> > ans;
void add(int t, int ind) {
  int l = strlen(s + 1), node = 0;
  for (int i = 1; i <= l; i++) {
    if (!T[node].ed[s[i] - 'a']) T[node].ed[s[i] - 'a'] = ++sz;
    node = T[node].ed[s[i] - 'a'];
  }
  T[node].v[t].push_back(ind);
}
void dfs(int cur, int back, int dep) {
  for (int i = 0; i < 26; i++)
    if (T[cur].ed[i]) dfs(T[cur].ed[i], cur, dep + 1);
  while ((int)T[cur].v[0].size() && (int)T[cur].v[1].size()) {
    cnt += dep;
    ans.push_back(make_pair(T[cur].v[0].back(), T[cur].v[1].back()));
    T[cur].v[0].pop_back();
    T[cur].v[1].pop_back();
  }
  if (back == -1) return;
  for (int t = 0; t < 2; t++) {
    while ((int)T[cur].v[t].size()) {
      T[back].v[t].push_back(T[cur].v[t].back());
      T[cur].v[t].pop_back();
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf(" %s", s + 1);
    add(0, i);
  }
  for (int i = 1; i <= n; i++) {
    scanf(" %s", s + 1);
    add(1, i);
  }
  dfs(0, -1, 0);
  printf("%d\n", cnt);
  for (auto i : ans) printf("%d %d\n", i.first, i.second);
  return 0;
}
