/*
题意: 给若干字符串,添加最少的字符把它们变成回文 ,并输出回文。
记忆化搜索,如果s[i]==s[j],dp[i][j]=dfs(i+1,j-1);
否则 dp[i][j]=min(dp[i][j],dfs(i+1,j),dfs(i,j-1);
最先开始也不造怎么输出,后来看了题解,递归输出 ,新姿势 = =。
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int dp[1010][1010];
char s[1010];
int dfs(int l,int r)
{
if(l==r || r<l) return dp[l][r]=0;
if(dp[l][r]!=INF) return dp[l][r];
if(s[l] == s[r]) dp[l][r]=dfs(l+1,r-1);
else dp[l][r] = min( dp[l][r], min( dfs(l+1,r), dfs(l,r-1))+1);
return dp[l][r];
}
void print(int l,int r)
{
if(r<l) return ;
if(l==r)
{
printf("%c",s[l]); return ;
}
if(s[l]==s[r])
{
printf("%c",s[l]);
print(l+1,r-1);
printf("%c",s[l]);
}
else if(dp[l][r]==dp[l+1][r]+1)
{
printf("%c",s[l]);
print(l+1,r);
printf("%c",s[l]);
}
else
{
printf("%c",s[r]);
print(l,r-1);
printf("%c",s[r]);
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
int l=strlen(s);
memset(dp,INF,sizeof(dp));
dfs(0,l-1);
printf("%d ",dp[0][l-1]);
print(0,l-1);
printf("\n");
}
return 0;
}