#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 17;
const int LENGTH = 800007;
int n;
string a[N], b[N];
int nodes_count;
int trie[LENGTH][26];
vector<int> info[LENGTH][2];
vector<int> v0, v1;
int match[N];
long long ans;
void insert_word(string s, int idx, int where) {
  int i, curr = 1;
  for (i = 0; i < (int)(s.size()); i++) {
    if (!trie[curr][s[i] - 'a']) {
      trie[curr][s[i] - 'a'] = ++nodes_count;
    }
    curr = trie[curr][s[i] - 'a'];
  }
  info[curr][where].push_back(idx);
}
long long dfs(int node, vector<int> &v0, vector<int> &v1) {
  int i, j;
  long long ans = 0;
  for (i = 0; i < 26; i++)
    if (trie[node][i]) {
      vector<int> g0, g1;
      ans += dfs(trie[node][i], g0, g1);
      for (j = 0; j < (int)(g0.size()); j++) v0.push_back(g0[j]);
      for (j = 0; j < (int)(g1.size()); j++) v1.push_back(g1[j]);
    }
  for (i = 0; i < (int)(info[node][0].size()); i++)
    v0.push_back(info[node][0][i]);
  for (i = 0; i < (int)(info[node][1].size()); i++)
    v1.push_back(info[node][1][i]);
  for (i = 0; i < (int)(v0.size()) && i < (int)(v1.size()); i++) {
    match[v0[v0.size() - i - 1]] = v1[v1.size() - i - 1];
  }
  while (!v0.empty() && !v1.empty()) v0.pop_back(), v1.pop_back();
  ans += v0.size() + v1.size();
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int i;
  nodes_count = 1;
  cin >> n;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    ans += a[i].size();
    insert_word(a[i], i, 0);
  }
  for (i = 1; i <= n; i++) {
    cin >> b[i];
    ans += b[i].size();
    insert_word(b[i], i, 1);
  }
  ans -= dfs(1, v0, v1);
  ans /= 2;
  printf("%lld\n", ans);
  for (i = 1; i <= n; i++) {
    printf("%d %d\n", i, match[i]);
  }
  return 0;
}
