/*
author : TIT_manh
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <numeric>
#include <functional>
#include <cassert>
#include <sstream>
#include <climits>
#define ll long long
#define ull unsigned long long
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FOD(i,r,l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define pb push_back
#define endl "\n"
#define m_int 0x3f3f3f3f
#define m_ll 0x3f3f3f3f3f3f3f3f
using namespace std;
int n, m, k;
void ciin() {
cin >> k >> m >> n;
}
bool vst[11][11][5];
// 1 : len 0 1
// 2 : xuong 0 -1
// 3 : trai -1 0
// 4 : phai 1 0
struct tt {
int x, y, pp;
};
int d1[5] = {0, 0, 0, -1, 1};
int d2[5] = {0, 1, -1, 0, 0};
int ax(int i, int j) {
return (i - 1) * m + j;
}
vector<int> grid[105];
int dist1[105];
int dist2[105];
void sub1() {
vector<vector<char>> a(n + 2, vector<char>(m + 2, 'x'));
FOR(i,1,n) FOR(j,1,m) cin >> a[i][j];
int v1, v2;
FOR(i,1,n) FOR(j,1,m) {
// khong tao khuyen
// xet chu trinh
if (a[i][j] == '1') v1 = ax(i, j);
if (a[i][j] == '2') v2 = ax(i, j);
memset(vst, false, sizeof vst);
queue<tt> q;
FOR(tst,1,4) {
int p = tst;
if (a[i][j] == 'A') {
if (p == 1) p = 3;
else if (p == 2) p = 4;
else if (p == 3) p = 2;
else p = 1;
}
else if (a[i][j] == 'C') {
if (p == 1) p = 4;
else if (p == 2) p = 3;
else if (p == 3) p = 1;
else p = 2;
}
q.push({i, j, p});
}
while (!q.empty()) {
auto [x, y, p] = q.front(); q.pop();
if (vst[x][y][p]) continue;
vst[x][y][p] = true;
int tx = x + d1[p], ty = y + d2[p];
if (a[tx][ty] == 'x') {
int t1 = ax(i, j), t2 = ax(x, y);
if (t1 != t2) grid[t1].pb(t2);
}
else {
if (a[tx][ty] == 'A') {
if (p == 1) p = 3;
else if (p == 2) p = 4;
else if (p == 3) p = 2;
else p = 1;
}
else if (a[tx][ty] == 'C') {
if (p == 1) p = 4;
else if (p == 2) p = 3;
else if (p == 3) p = 1;
else p = 2;
}
q.push({tx, ty, p});
}
}
}
// dijkstra
memset(dist1, -1, sizeof dist1);
queue<int> pq;
dist1[v1] = 0;
pq.push(v1);
while (!pq.empty()) {
int u = pq.front(); pq.pop();
for (auto& v : grid[u]) if (dist1[v] == -1) {
dist1[v] = dist1[u] + 1;
pq.push(v);
}
}
memset(dist2, -1, sizeof dist2);
dist2[v2] = 0;
pq.push(v2);
while (!pq.empty()) {
int u = pq.front(); pq.pop();
for (auto& v : grid[u]) if (dist2[v] == -1) {
dist2[v] = dist2[u] + 1;
pq.push(v);
}
}
int res = m_int;
FOR(i,1,ax(n, m)) if (dist1[i] != -1 && dist2[i] != -1) {
res = min(res, dist1[i] + dist2[i]);
cout << dist1[i] << ' ' << dist2[i] << endl;
}
cout << ((res == m_int) ? -1 : res);
}
void solve() {
if (k == 1) cout << 0 << endl;
else if (k == 2 && n <= 10 && m <= 10) sub1();
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ciin(); solve();
return 0;
}