#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=1e3+2e2+10;
int n;
char a[N][N];
struct node{
int x,y;
ll t;
};
priority_queue<node> q;
bool f[N][N];
int u,v,w;
ll b1,b2,b3,ans;
bool operator<(node x1,node x2)
{
return x1.t<x2.t;
}
inline bool check(int x,int y)
{
if(x<1 || y<1 || x>n || y>n || f[x][y]==true || a[x][y]=='*'){
return false;
}
else{
return true;
}
}
ll bfs(int x,int y)
{
up(i,0,N-1,1){
up(j,0,N-1,1){
f[i][j]=false;
}
}
while(!q.empty()){
q.pop();
}
q.push({x,y,1});
f[x][y]=true;
while(!q.empty()){
u=q.top().x;
v=q.top().y;
w=q.top().t;
q.pop();
if(u==n && v==n){
return w;
}
if(a[u][v]=='A'){
if(check(u+1,v)){
f[u+1][v]=true;
q.push({u+1,v,w+1});
}
if(check(u-1,v)){
f[u-1][v]=true;
q.push({u-1,v,w+1});
}
if(check(u,v+1)){
f[v][u+1]=true;
q.push({u,v+1,w+1});
}
if(check(u,v-1)){
f[u][v-1]=true;
q.push({u,v-1,w+1});
}
}
else if(a[u][v]=='B'){
if(check(u+2,v) && a[u+1][v]!='#'){
f[u+2][v]=true;
q.push({u+2,v,w+1});
}
if(check(u-2,v) && a[u-1][v]!='#'){
f[u-2][v]=true;
q.push({u-2,v,w+1});
}
if(check(u,v+2) && a[u][v+1]!='#'){
f[u][v+2]=true;
q.push({u,v+2,w+1});
}
if(check(u,v-2) && a[u][v-1]!='#'){
f[u][v-2]=true;
q.push({u,v-2,w+1});
}
}
else if(a[u][v]=='C'){
if(check(u-1,v-1)){
f[u-1][v-1]=true;
q.push({u-1,v-1,w+1});
}
if(check(u-1,v+1)){
f[u-1][v+1]=true;
q.push({u-1,v+1,w+1});
}
if(check(u+1,v-1)){
f[u+1][v-1]=true;
q.push({u+1,v-1,w+1});
}
if(check(u+1,v+1)){
f[u+1][v+1]=true;
q.push({u+1,v+1,w+1});
}
}
}
return LLONG_MAX;
}
void solve()
{
cin>>n;
up(i,1,n,1){
up(j,1,n,1){
cin>>a[i][j];
}
}
b1=bfs(1,1);
b2=bfs(1,n);
b3=bfs(n,1);
ans=LLONG_MAX;
ans=min({ans,b1,b2,b3});
if(ans==LLONG_MAX){
cout<<"No answer";
}
else{
cout<<ans;
}
cout<<endl;
return;
}
int main()
{
int _=1;
up(i,1,_,1){
solve();
}
return 0;
}