#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
inline void getstr(char s[],int&ls)
{
register char c=0;
while(!(c>='a' && c<='z'))
c=getchar();
ls=0;
while(c>='a' && c<='z')
s[++ls]=c,c=getchar();
s[ls+1]=0;
return;
}
char s[905050];
int cnt,son[801010][27];
int ecnt1,enext1[801010],ends1[801010],elst1[801010],eidx1[801010];
int ecnt2,enext2[801010],ends2[801010],elst2[801010],eidx2[801010];
int tans,ans[105050];
int depth;
inline void DFS(register int o)
{
//printf("%d %d\n",o,depth);
depth++;
for(register int j=0,s;j<26;j++)
if((s=son[o][j]))
{
//printf("%d --%c--> %d\n",o,j+'a',s),
DFS(s);
if(ends1[s])
{
(elst1[o] ? enext1[elst1[o]]=ends1[s] : ends1[o]=ends1[s]);
elst1[o]=elst1[s];
}
if(ends2[s])
{
(elst2[o] ? enext2[elst2[o]]=ends2[s] : ends2[o]=ends2[s]);
elst2[o]=elst2[s];
}
}
depth--;
for(register int j1=ends1[o],j2=ends2[o];j1 && j2;)
{
tans+=depth,ans[eidx1[j1]]=eidx2[j2];
ends1[o]=j1=enext1[j1],ends2[o]=j2=enext2[j2];
}
}
int main()
{
int N;scanf("%d",&N);
for(register int i=1;i<=N;i++)
{
int ls;getstr(s,ls);
register int now=0;
for(register int j=1,tnow;j<=ls;j++)
if(!(tnow=son[now][s[j]-'a']) || !(now=tnow))
now=son[now][s[j]-'a']=++cnt;
enext1[++ecnt1]=ends1[now],ends1[now]=ecnt1,eidx1[ecnt1]=i;
if(!elst1[now])
elst1[now]=ecnt1;
}
for(register int i=1;i<=N;i++)
{
int ls;getstr(s,ls);
register int now=0;
for(register int j=1,tnow;j<=ls;j++)
if(!(tnow=son[now][s[j]-'a']) || !(now=tnow))
now=son[now][s[j]-'a']=++cnt;
enext2[++ecnt2]=ends2[now],ends2[now]=ecnt2,eidx2[ecnt2]=i;
if(!elst2[now])
elst2[now]=ecnt2;
}
DFS(0);
printf("%d\n",tans);
for(register int i=1;i<=N;i++)
printf("%d %d\n",i,ans[i]);
return 0;
}