#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#define INFINITE 0x7F7F7F7F
#define _min(_a_,_b_) ((_a_)<(_b_)?(_a_):(_b_))
#define _max(_a_,_b_) ((_a_)>(_b_)?(_a_):(_b_))
#define GetReverse(_x) ((_x)&1 ? (_x)+1 : (_x)-1)
int gcnt,ghead[105050],gnext[1505050],gnode[1505050],gflow[1505050];
inline void insertLine(register int s,register int t,const int&v=1)
{
gnext[++gcnt]=ghead[s],ghead[s]=gcnt,gnode[gcnt]=t,gflow[gcnt]=v;
gnext[++gcnt]=ghead[t],ghead[t]=gcnt,gnode[gcnt]=s,gflow[gcnt]=0;
}
int N;
int _i,pos[355][355][26];
int tmcnt,cnt,son[105050][26];
void DFSx(register int step,register int x,register int now)
{
if(step<=0 || tmcnt<=0)
return;
for(register int j=0;j<26;j++)
if(pos[_i][x][j])
{
if(!son[now][j])
son[now][j]=++cnt;
insertLine(_i,son[now][j]);
tmcnt--,DFSx(step-1,pos[_i][x][j],son[now][j]);
}
}
int S,T;
int dist[105050];
inline bool BFS()
{
static int lst[105050];
register int front=0,rear=0;
memset(dist,0,sizeof(dist));
dist[S]=1,lst[rear++]=S;
while(front<rear)
{
register int now=lst[front++];
for(register int j=ghead[now],t;j;j=gnext[j])
if(gflow[j]>0 && !dist[t=gnode[j]])
dist[t]=dist[now]+1,lst[rear++]=t;
}
return dist[T];
}
int cur[105050];
int DFS(register int now,register int mxflow)
{
if(now == T)
return mxflow;
for(register int j=cur[now],t;j;j=gnext[j])
{
cur[now]=j,t=gnode[j];
if(!(gflow[j]>0 && dist[t]==dist[now]+1))
continue;
register int nf=DFS(t,_min(mxflow,gflow[j]));
if(nf)
{
gflow[j]-=nf;
gflow[GetReverse(j)]+=nf;
return nf;
}
}
return 0;
}
inline int Dinic()
{
register int ans=0;
while(BFS())
{
for(register int i=1;i<=T;i++)
cur[i]=ghead[i];
while(int nf=DFS(S,INFINITE))
ans+=nf;
}
return ans;
}
inline bool CheckValid(register int len)
{
gcnt=0,memset(ghead,0,sizeof(ghead));
memset(son,0,sizeof(son));
cnt=N;
for(register int i=1;i<=N;i++)
_i=i,tmcnt=N,DFSx(len,0,1);
S=cnt+1,T=S+1;
for(register int i=1;i<=N;i++)
insertLine(S,i);
for(register int i=N+1;i<=cnt;i++)
insertLine(i,T);
return Dinic()==N;
}
int nodemap[105050],top;
char stk[105050],ans[355][105050];
void DFSt(register int now)
{
if(nodemap[now])
memcpy(ans[nodemap[now]],stk,sizeof(stk));
for(register int j=0;j<26;j++)
if(son[now][j])
stk[++top]=j+'a',DFSt(son[now][j]),stk[top--]=0;
}
char s[105050];
int main()
{
scanf("%d",&N);
register int mxls=0;
for(register int lp=1;lp<=N;lp++)
{
scanf("%s",&s[1]);
register int ls=strlen(&s[1]);
for(register int i=ls-1;i>=0;i--)
{
for(register int j=0;j<26;j++)
pos[lp][i][j]=pos[lp][i+1][j];
pos[lp][i][s[i+1]-'a']=i+1;
}
mxls=_max(mxls,ls);
}
register int left=1,right=mxls;
while(left<=right)
{
register int mid=(left+right)>>1;
if(CheckValid(mid))
right=mid-1;
else
left=mid+1;
}
if(right+1>mxls)
{
printf("%d\n",-1);
return 0;
}
printf("%d\n",right+1);
CheckValid(right+1);
for(register int i=1;i<=N;i++)
for(register int j=ghead[i];j;j=gnext[j])
if(!gflow[j])
{
nodemap[gnode[j]]=i;
break;
}
DFSt(1);
for(register int i=1;i<=N;i++)
printf("%s\n",&ans[i][1]);
return 0;
}