#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
const int maxn = 800800;
typedef vector<int> vi;
#define pb push_back
int t[maxn][26];
vi words[maxn];
int sz = 2;
vector<pair<int, int> > res;
int total;
void add(int v, const char* s, int id) {
while (*s) {
int c = *s - 'a';
if (!t[v][c]) t[v][c] = sz++;
v = t[v][c];
++s;
}
words[v].push_back(id);
}
void gen() {
freopen("input.txt", "w", stdout);
int n = 100000;
printf("%d\n", n);
forn(i, 2*n) {
forn(c, 4) printf("%c", 'a'+rand()%26);
printf("\n");
}
exit(0);
}
void merge(vi*& a, vi *& b) {
if (a->size() < b->size()) swap(a, b);
a->insert(a->end(), b->begin(), b->end());
delete b;
}
vi* dfs(int v, int h) {
vi *b = new vi, *w = new vi;
for (auto x: words[v]) {
if (x < 0) b->push_back(x);
else w->push_back(x);
}
forn(i, 26) if (t[v][i]) {
vi* ch = dfs(t[v][i], h+1);
if (!ch->empty()) {
if (ch->front() < 0) merge(b, ch);
else merge(w, ch);
} else {
delete ch;
}
}
size_t mn = min(b->size(), w->size());
forn(i, mn) {
int x = b->back(), y = w->back();
res.pb(make_pair(y, ~x));
b->pop_back();
w->pop_back();
total += h;
}
if (b->empty()) { delete b; return w; }
else { delete w; return b; }
}
char buf[maxn];
void scan() {
int n;
scanf("%d", &n);
forn(K, 2) {
forn(i, n) {
scanf("%s", buf);
add(1, buf, K ? i : ~i);
}
}
dfs(1, 0);
printf("%d\n", total);
for (auto kv: res) {
printf("%d %d\n", kv.second + 1, kv.first + 1);
}
}
int main() {
//gen();
#ifdef HOME
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scan();
return 0;
}