#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
inline int my_getchar_unlocked(){
static char buf[1048576];
static int s = 1048576;
static int e = 1048576;
if(s == e && e == 1048576){
e = fread_unlocked(buf, 1, 1048576, stdin);
s = 0;
}
if(s == e){
return EOF;
}
return buf[s++];
}
inline void rd(char &c){
int i;
for(;;){
i = my_getchar_unlocked();
if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
break;
}
}
c = i;
}
inline int rd(char c[]){
int i;
int sz = 0;
for(;;){
i = my_getchar_unlocked();
if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
break;
}
}
c[sz++] = i;
for(;;){
i = my_getchar_unlocked();
if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF){
break;
}
c[sz++] = i;
}
c[sz]='\0';
return sz;
}
struct MY_WRITER{
char buf[1048576];
int s;
int e;
MY_WRITER(){
s = 0;
e = 1048576;
}
~MY_WRITER(){
if(s){
fwrite_unlocked(buf, 1, s, stdout);
}
}
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked(int a){
if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
MY_WRITER_VAR.s = 0;
}
MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
}
inline void wt_L(char a){
my_putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
my_putchar_unlocked('-');
}
while(s--){
my_putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(const char c[]){
int i=0;
for(i=0;c[i]!='\0';i++){
my_putchar_unlocked(c[i]);
}
}
int N;
char S[1000000+2];
char gen[10000000];
int len;
char res[27];
char rev[27];
int main(){
int s;
int i;
int j;
int k;
N = rd(S);
gen[len++] = 'A';
for(i=(1);i<(23);i++){
k = len;
gen[len++] = 'A' + i;
for(j=(0);j<(k);j++){
gen[len++] = gen[j];
}
}
for(s=(0);s<(2000000);s++){
for(i=(0);i<(26);i++){
res[i] = rev[i] = 0;
}
for(i=(0);i<(N);i++){
if(rev[S[i]-'A'] == 0 && res[gen[i+s]-'A'] == 0){
rev[S[i]-'A'] = gen[i+s];
res[gen[i+s]-'A'] = S[i];
}
if(rev[S[i]-'A'] != gen[i+s] || res[gen[i+s]-'A'] != S[i]){
goto cTE1_r3A;
}
}
for(i=(0);i<(26);i++){
for(j=(0);j<(26);j++){
if(res[i]==0 && rev[j]==0){
res[i] = 'A' + j;
rev[j] = 'A' + i;
}
}
}
wt_L(res);
wt_L('\n');
wt_L(s+1);
wt_L('\n');
return 0;
cTE1_r3A:;
}
wt_L("No solution");
wt_L('\n');
return 0;
}
// cLay varsion 20201031-1
// --- original code ---
// int N;
// char S[1d6+2];
// char gen[1d7]; int len;
// char res[27], rev[27];
// {
// int i, j, k;
// rd(S@N);
//
// gen[len++] = 'A';
// rep(i,1,23){
// k = len;
// gen[len++] = 'A' + i;
// rep(j,k) gen[len++] = gen[j];
// }
//
// rep(s,2d6){
// rep(i,26) res[i] = rev[i] = 0;
// rep(i,N){
// if(rev[S[i]-'A'] == 0 && res[gen[i+s]-'A'] == 0){
// rev[S[i]-'A'] = gen[i+s];
// res[gen[i+s]-'A'] = S[i];
// }
// if(rev[S[i]-'A'] != gen[i+s] || res[gen[i+s]-'A'] != S[i]) break_continue;
// }
// rep(i,26) rep(j,26) if(res[i]==0 && rev[j]==0){
// res[i] = 'A' + j;
// rev[j] = 'A' + i;
// }
// wt(res);
// wt(s+1);
// return 0;
// }
//
// wt("No solution");
// }