#include <bits/stdc++.h>
using namespace std;
int go[900000][27], I, s1[900000], s2[900000];
vector<int> v[900000], g[900000];
int h1[900000], h2[900000];
int n;
char s[950000];
int add(int nod, int c) {
  if (!go[nod][c]) go[nod][c] = ++I;
  return go[nod][c];
}
long long int RES;
vector<int> A, B;
vector<pair<int, int> > res;
void dfs(int nod) {
  RES += min(s1[nod], s2[nod]);
  long long int a = 0;
  for (long long int i = 0; i <= 25; i++)
    if (go[nod][i]) {
      dfs(go[nod][i]);
      a += min(s1[go[nod][i]], s2[go[nod][i]]);
    }
  a = min(s1[nod], s2[nod]) - a;
  A.clear();
  B.clear();
  for (typeof(v[nod].begin()) it = v[nod].begin(); it != v[nod].end(); it++)
    if (!h1[*it]) A.push_back(*it);
  for (typeof(g[nod].begin()) it = g[nod].begin(); it != g[nod].end(); it++)
    if (!h2[*it]) B.push_back(*it);
  for (long long int i = 0; i <= a - 1; i++) {
    res.push_back(make_pair(A[i], B[i]));
    h1[A[i]] = h2[B[i]] = 1;
  }
}
int main() {
  cin >> n;
  for (long long int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    int u = strlen(s + 1);
    int now = 0;
    v[now].push_back(i);
    s1[now]++;
    for (long long int j = 1; j <= u; j++) {
      now = add(now, s[j] - 'a');
      v[now].push_back(i);
      s1[now]++;
    }
  }
  for (long long int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    int u = strlen(s + 1);
    int now = 0;
    g[now].push_back(i);
    s2[now]++;
    for (long long int j = 1; j <= u; j++) {
      if (!go[now][s[j] - 'a']) break;
      now = add(now, s[j] - 'a');
      g[now].push_back(i);
      s2[now]++;
    }
  }
  dfs(0);
  cout << RES - n << endl;
  for (long long int i = 0; i <= n - 1; i++)
    printf("%d %d\n", res[i].first, res[i].second);
}
