#include<stdio.h>
#include<string.h>
#include<math.h>
#include <ctype.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 105;
const int inf = 1<<30;
int n,m,key,ans;
int dis[maxn][maxn];
bool vis[maxn][maxn],mark[maxn];
char map[maxn][maxn];
int xs[] = {0,1,0,-1};
int ys[] = {1,0,-1,0};
struct node
{
int x,y,step;
}p[maxn];
void BFS( int x,int y,int s )
{
queue<node>que;
memset(vis,0,sizeof(vis));
node cur,cnt;
cur.x = x; cur.y = y; cur.step = 0;
vis[x][y] = 1;
que.push(cur);
while( !que.empty() ){
cur = que.front(); que.pop();
for( int i = 0; i < 4; i ++ ){
cnt.x = cur.x + xs[i];
cnt.y = cur.y + ys[i];
if( cnt.x >= 1 && cnt.x <= n && cnt.y >= 1 && cnt.y <= m && map[cnt.x][cnt.y] != '#' && !vis[cnt.x][cnt.y] ){
vis[cnt.x][cnt.y] = 1;
cnt.step = cur.step + 1;
if( isalpha(map[cnt.x][cnt.y]) ){
dis[s][map[cnt.x][cnt.y]-65] = cnt.step;
}
que.push(cnt);
}
}
}
}
void DFS( int s,int step,int k )
{
if( k == key ){
ans = ans < step?ans:step;
return;
}
if( step > ans )
return;
for( int i = 1; i <= key; i ++ ){
if( !mark[i] ){
mark[i] = 1;
DFS(i,step + dis[s][i],k+1);
mark[i] = 0;
}
}
}
int main()
{
freopen("data.txt","r",stdin);
while( scanf("%d%d",&n,&m) == 2,( n||m ) ){
for( int i = 1; i <= n; i ++ ){
getchar();
for( int j = 1; j <= m; j ++ ){
scanf("%c",&map[i][j]);
if( map[i][j] == '@' ){
p[0].x = i; p[0].y = j;
map[i][j] = 'A';
}
}
}
scanf("%d",&key);
for( int i = 1; i <= key; i ++ ){
scanf("%d%d",&p[i].x,&p[i].y);
map[p[i].x][p[i].y] = 'A'+i;
}
for( int i = 0; i <= key; i ++ ){
BFS(p[i].x,p[i].y,i);
}
ans = inf;
memset(mark,0,sizeof(mark));
DFS(0,0,0);
if( ans != 0 )
printf("%d\n",ans);
else
puts("-1");
}
return 0;
}