# include <bits/stdc++.h>
using namespace std;
# define ii pair<int, int>
# define vt vector <int>
# define ll long long
struct Node{
Node *child[26];
vt schools, companies;
Node(){
for (int i=0; i<26; i++) child[i]=nullptr;
}
};
ll total_lcp=0;
vector<ii> matches;
void inserts(Node *root, const string &s, int id, bool is_school){
Node *curr=root;
for (char c:s){
int idx=c-'a';
if (!curr->child[idx]) curr->child[idx]=new Node();
curr=curr->child[idx];
}
if (is_school) curr->schools.push_back(id);
else curr->companies.push_back(id);
}
void dfs(Node *curr, int depth){
for (int i=0; i<26; i++){
if (curr->child[i]){
dfs(curr->child[i], depth+1);
for (int id:curr->child[i]->schools)
curr->schools.push_back(id);
for (int id:curr->child[i]->companies)
curr->companies.push_back(id);
delete curr->child[i];
curr->child[i]=nullptr;
}
}
// Ghep cap nut hien tai
while (!curr->schools.empty()&&!curr->companies.empty()){
matches.push_back({curr->schools.back(),
curr->companies.back()});
curr->schools.pop_back();
curr->companies.pop_back();
total_lcp+=depth;
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//ifstream cin ("a.inp");
int n; cin >> n;
Node *root=new Node();
for (int i=1; i<=n; i++){
string s; cin >> s;
inserts(root,s,i,true);
}
for (int i=1; i<=n; i++){
string s; cin >> s;
inserts(root,s,i,false);
}
dfs(root, 0);
cout << total_lcp <<"\n";
for (auto &p:matches)
cout << p.first <<" "<<p.second<< "\n";
delete root;
}