Go: package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

func configure(scanner *bufio.Scanner) {
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1000005), 1000005)
}
func getNextString(scanner *bufio.Scanner) string {
	scanned := scanner.Scan()
	if !scanned {
		panic("scan failed")
	}
	return scanner.Text()
}
func getNextInt(scanner *bufio.Scanner) int {
	i, _ := strconv.Atoi(getNextString(scanner))
	return i
}
func getNextInt64(scanner *bufio.Scanner) int64 {
	i, _ := strconv.ParseInt(getNextString(scanner), 10, 64)
	return i
}
func getNextFloat64(scanner *bufio.Scanner) float64 {
	i, _ := strconv.ParseFloat(getNextString(scanner), 64)
	return i
}
func main() {
	fp := os.Stdin
	wfp := os.Stdout
	extra := 0
	if os.Getenv("I") == "IronMan" {
		fp, _ = os.Open(os.Getenv("END_GAME"))
		extra = 100
	}
	scanner := bufio.NewScanner(fp)
	configure(scanner)
	writer := bufio.NewWriter(wfp)
	defer func() {
		r := recover()
		if r != nil {
			fmt.Fprintln(writer, r)
		}
		writer.Flush()
	}()
	solve(scanner, writer)
	for i := 0; i < extra; i++ {
		fmt.Fprintln(writer, "-----------------------------------")
		solve(scanner, writer)
	}
}
func solve(scanner *bufio.Scanner, writer *bufio.Writer) {
	dy := [4]int{-1, 0, 0, 1}
	dx := [4]int{0, -1, 1, 0}
	for {
		h := getNextInt(scanner)
		w := getNextInt(scanner)
		if h == 0 {
			break
		}
		grid := makeGrid(h, w)
		a := [2]int{}
		b := [2]int{}
		for i := 0; i < h; i++ {
			s := getNextString(scanner)
			for j := 0; j < w; j++ {
				if s[j] == '#' {
					grid[i][j] = math.MaxInt32
					continue
				}
				if s[j] == 'A' {
					a[0] = i
					a[1] = j
					continue
				}
				if s[j] == 'B' {
					b[0] = i
					b[1] = j
				}
				grid[i][j] = math.MaxInt32 - 1
			}
		}
		q := make([][2]int, 0)
		q = append(q, a)
		for len(q) > 0 {
			p := q[0]
			q = q[1:]
			for i := 0; i < 4; i++ {
				yy := p[0] + dy[i]
				xx := p[1] + dx[i]
				if yy == a[0] && xx == a[1] {
					continue
				}
				if yy < 0 || yy >= h {
					continue
				}
				if xx < 0 || xx >= w {
					continue
				}
				if grid[yy][xx] == math.MaxInt32 {
					continue
				}
				if grid[yy][xx] <= grid[p[0]][p[1]]+1 {
					continue
				}
				grid[yy][xx] = grid[p[0]][p[1]] + 1
				q = append(q, [2]int{yy, xx})
			}
		}
		move := getNextString(scanner)
		i := 0
		m := len(move)
		for {
			if i > 400 {
				fmt.Fprintln(writer, "impossible")
				break
			}
			if grid[b[0]][b[1]] <= i {
				fmt.Fprintln(writer, fmt.Sprintf("%d %d %d", i, b[0], b[1]))
				break
			}
			switch move[i%m] {
			case '8':
				if b[0] > 0 {
					b[0]--
				}
			case '6':
				if b[1]+1 < w {
					b[1]++
				}
			case '4':
				if b[1] > 0 {
					b[1]--
				}
			case '2':
				if b[0]+1 < h {
					b[0]++
				}
			}
			i++
		}
	}
}
func makeGrid(h, w int) [][]int {
	index := make([][]int, h, h)
	data := make([]int, h*w, h*w)
	for i := 0; i < h; i++ {
		index[i] = data[i*w : (i+1)*w]
	}
	return index
}

C++: #include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<sstream>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
#define shosu(x) fixed<<setprecision(x)
const double PI=acos(-1);
const double EPS=1e-8;
const int inf=1e9;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pii;
int n,m;
vector<string>in;
vvi cnt;
int sx,sy,bx,by;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int main(){
	while(cin>>n>>m,n+m){
		in=vector<string>(n);
		cnt=vvi(n,vi(m,-1));
		rep(i,n)cin>>in[i];
		rep(i,n)rep(j,m)if(in[i][j]=='B'){
			bx=i;by=j;in[i][j]='.';
		}else if(in[i][j]=='A'){
			sx=i;sy=j;in[i][j]='.';
		}
//		f(sx,sy,0);
		queue<pair<pii,int> >qu;
		qu.push(pair<pii,int>(pii(sx,sy),0));
		cnt[sx][sy]=0;
		while(!qu.empty()){
			pair<pii,int>q=qu.front();qu.pop();
			pii t=q.first;
			rep(i,4){
				int nx=t.first+dx[i];
				int ny=t.second+dy[i];
				if(nx<0||ny<0||nx>=n||ny>=m)continue;
				if(in[nx][ny]=='.'&&cnt[nx][ny]==-1){
					cnt[nx][ny]=q.second+1;
					qu.push(pair<pii,int>(pii(nx,ny),q.second+1));
				}
			}
		}
//		rep(i,n){rep(j,m)cout<<" "<<(int)cnt[i][j];cout<<endl;}
		int mi=inf,ax,ay;
		string s;
		cin>>s;
		int c=0;
		rep(i,300){
//			cout<<bx<<" "<<by<<endl;
			if(cnt[bx][by]!=-1){
				int t=cnt[bx][by];
				if(t<=i&&mi>i){
					mi=min(mi,i);
					ax=bx;ay=by;
				}
			}//442688
			if(s[c]=='5');
			else if(s[c]=='8'&&bx)bx--;
			else if(s[c]=='6'&&by<m-1)by++;
			else if(s[c]=='4'&&by)by--;
			else if(s[c]=='2'&&bx<n-1)bx++;
			c++;
			if(c==s.size())c=0;
		}
		
		if(mi==inf)cout<<"impossible"<<endl;
		else cout<<mi<<" "<<ax<<" "<<ay<<endl;
	}
}

C++: #import<stdio.h>
#import<queue>
int main(){std::queue<int>q;int w,h,f[484],i,j,a,b,t,x,z;char p[15];for(;scanf("%d%d ",&h,&w),h;){for(j=0;j<w+2;j++)f[j]=f[j-~h*22]=-1;for(i=1;i<=h;i++){for(j=1;j<=w;j++)f[x=i*22+j]=-2,z=getchar(),z-35?z>65?b=x:z>64?a=x:1:--f[x];f[i*22]=f[i*22-~w]=-1;getchar();}f[a]=t=0;q.push(0);for(q.push(a);a=q.front(),q.size()>1;q.pop())if(!a)++t,q.push(0);else for(i=4;i--;)if(f[x=a+" 57L"[i]-54]==-2)f[x]=t,q.push(x);q.pop();scanf("%s",p);for(a=t=0;!a;){x=b;z=0;for(i=0;!a&&p[i];f[b]>=0&&++z)++t,~f[j=b-54+"L65676 "[p[i++]-50]]?b=j:0,f[b]>=0&t>=f[b]?a=b:0;!z&!a&!p[i]&b==x&f[b]<0&&--a;}printf(~a?"%d %d %d\n":"impossible\n",t,a/22-1,a%22-1);}}

C++: #include<iostream>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define inRange(x,a,b) (a <= x && x < b)
int di[5] = {0,0,1,-1,0};
int dj[5] = {1,-1,0,0,0};

int main(){
    map<char,int> act;
    act['5'] = 4;
    act['8'] = 3;
    act['6'] = 0;
    act['4'] = 1;
    act['2'] = 2;
    int h, w;
    while(cin >> h >> w, h+w){
        int si, sj, gi, gj;
        char mat[h][w];
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                cin >> mat[i][j];
                if(mat[i][j] == 'A')    si = i, sj = j;
                if(mat[i][j] == 'B')    gi = i, gj = j;
            }
        }
        vector<vector<int>> step(h, vector<int>(w, 1<<30));
        queue<pair<int, pair<int,int>>> q;
        q.push({0, {si, sj}});
        int maxstep;
        while(!q.empty()){
            auto p = q.front(); q.pop();
            int cost = p.first, i = p.second.first, j = p.second.second;
            if(step[i][j] <= cost)  continue;
            step[i][j] = cost;
            maxstep = cost;
            for(int k = 0; k < 4; k++){
                int ni = i+di[k], nj = j+dj[k];
                if(inRange(ni, 0, h) && inRange(nj, 0, w) && mat[ni][nj] != '#' && cost+1 < step[ni][nj]){
                    q.push({cost+1, {ni, nj}});
                }
            }
        }
        string s;
        cin >> s;
        int slen = s.length();
        int last = 0, turn = 0;
        vector<vector<bool>> ghost(h, vector<bool>(w, 0));
        bool meet = false;
        while(turn < maxstep+5 || turn-last < slen){
            int ngi = gi+di[act[s[turn%slen]]], ngj = gj+dj[act[s[turn%slen]]];
            if(!inRange(ngi, 0, h) || !inRange(ngj, 0, w))  ngi = gi, ngj = gj;
            gi = ngi, gj = ngj;
            if(!ghost[gi][gj]){
                last = turn+1;
                ghost[gi][gj] = true;
            }
            turn++;
            if(step[gi][gj] <= turn){
                cout << turn << " " << gi << " " << gj << endl;
                meet = true;
                break;
            }
        }

        if(!meet){
            cout << "impossible" << endl;
        }
    }
    return 0;
}