#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long maxn = 9e5;
const long long mod = 1e9 + 7;
const long double PI = acos((long double)-1);
long long pw(long long a, long long b, long long md = mod) {
  long long res = 1;
  while (b) {
    if (b & 1) {
      res = (a * res) % md;
    }
    a = (a * a) % md;
    b >>= 1;
  }
  return (res);
}
int n;
string s;
int ch[maxn][27];
int cur, ans[maxn], sum;
int cnt[maxn];
vector<int> vec[maxn][2];
int vl[maxn];
void add(int ind, int t = 0) {
  int pos = 0;
  for (auto i : s) {
    if (!ch[pos][i - 'a']) {
      ch[pos][i - 'a'] = ++cur;
    }
    pos = ch[pos][i - 'a'];
    cnt[pos]++;
  }
  vec[pos][t].push_back(ind);
}
void merge(int v, int u) {
  if (!u) return;
  for (auto i : vec[u][0]) vec[v][0].push_back(i);
  for (auto i : vec[u][1]) vec[v][1].push_back(i);
}
void dfs(int v = 0, int h = 0) {
  int mx = v;
  for (int i = 0; i < 26; i++) {
    if (ch[v][i]) {
      dfs(ch[v][i], h + 1);
      if (vl[ch[v][i]] > vl[mx]) mx = ch[v][i];
    }
  }
  swap(vec[v][0], vec[mx][0]);
  swap(vec[v][1], vec[mx][1]);
  for (int i = 0; i < 26; i++) {
    merge(v, ch[v][i]);
  }
  sum += min((int)vec[v][0].size(), (int)vec[v][1].size()) * h;
  while (vec[v][0].size() and vec[v][1].size()) {
    ans[vec[v][0].back()] = vec[v][1].back();
    vec[v][0].pop_back(), vec[v][1].pop_back();
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> s;
    add(i);
  }
  for (int i = 1; i <= n; i++) {
    cin >> s;
    add(i, 1);
  }
  dfs();
  cout << sum << '\n';
  for (int i = 1; i <= n; i++) {
    cout << i << ' ' << ans[i] << '\n';
  }
  return (0);
}
