#include <stdio.h>
#include <iostream>
#include <queue>
#include <unordered_map>
#include <cstring>
#include <string>
#define mpir(a, b) make_pair(a, b)
using namespace std;
const int N = 10;
int n = 1;
string A, B;
string As[N], Bs[N];
int extend(queue<string > &q, unordered_map<string, int> &s1, unordered_map<string, int> &s2, string src[], string des[]){
//如果相遇,返回最小步数,如果没有相遇,返回
string str = q.front();
//int steps = q.front().steps();
q.pop();
// cout<<str<<endl << "------" << endl;
for(int i = 1; i <= n; i++){
int begin = str.find(src[i]);
while(~begin){
string backup = str;
str.replace(begin, src[i].size(), des[i]);
// cout << str << endl;
auto it = s1.find(str); //看str在正向有无被访问过
if(it != s1.end()){ //若有
str = backup; //恢复原先状态,继续遍历下一个节点
begin = str.find(src[i], begin+1);
continue;
}
it = s2.find(str); //看str在反向有无遍历过
if(it != s2.end()){ //若有,两个方向相遇
return s1[backup] + s2[str]+1; //返回结果
}
//**************************//
//if(s1[backup] + 1 <= 5){
//*这里需要注意************************//
//*两个方向长度严格小于L/2时并不是必须的(1),甚至是错误的(2) //
//*(1)因为在extend入口处我们已经规定了仅有较短的队列能够进来//
//*而当前bfs的复杂度 跟队列里元素数量的相关系数 比 跟遍历深度的相关系数 更大//
//*所以并不需要讲两边的遍历深度严格控制//
//*(2)若真如此规定,会出现错误答案//
//如某方向先到达L/2(这里是5) //
//并且此时队列规模小于另一队列//
//则较小的队列将一直pop直至为空//
//而solve的主循环也将终止 //
// *************************//
//若无,继续遍历
s1[str] = s1[backup] + 1;
q.push(str);
//}
str = backup;
begin = str.find(src[i], begin + 1);
}
}
return -1;
}
void solve(){
if(A == B){
printf("%d", 0);
return;
}
queue<string > q1, q2; //q1正向,q2反向
unordered_map<string, int> s1, s2; //s1正向,s2反向
q1.push(A), s1[A] = 0;
q2.push(B), s2[B] = 0;
while(q1.size() && q2.size()){
int t = -1;
if(q1.size() > q2.size())
t = extend(q2, s2, s1, Bs, As);
else
t = extend(q1, s1, s2, As, Bs);
if(~t){
printf("%d", t);
return;
}
}
printf("NO ANSWER!");
}
int main(void){
cin >> A >> B;
while(cin >> As[n] >> Bs[n])
n++;
n--;
solve();
}
// int main(void){
// // int n;
// cin >> n;
// cin >> A >> B;
// for(int i = 1; i <= n; i++)
// cin >> As[i] >> Bs[i];
// solve();
// }