#include<cstdio>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

int h,w;
char B[20][20];

// ツタツイツδ?セツーツδ仰づ個湘ョツ陛ア
int n;
int id[8],val[8],s[8],g[8];
int val_sum[1<<8];

int dp[101][20][20][1<<8];
int dfs(int t,int y,int x,int S){
	int &res=dp[t][y][x][S];
	if(res!=-1) return res;

	if(t==100) return res=val_sum[S];

	int S_next=S;
	rep(i,n) if(s[i]<=t && t<g[i] && (S&1<<i)==0){ // i ツ氾板姪堋づ個タツイツδ?セツーツδ?
		bool ok=false; // ツ療猟静堋マツスツづ可渉、ツ品 id[i] ツつェツつ?づゥツつゥツづ?つ、ツつゥ
		rep(k,4){
			int yy=y+dy[k],xx=x+dx[k];
			if(0<=yy && yy<h && 0<=xx && xx<w && B[yy][xx]==id[i]+'0') ok=true;
		}
		if(ok) S_next|=1<<id[i];
	}

	res=0;
	rep(k,4){
		int yy=y+dy[k],xx=x+dx[k];
		if(0<=yy && yy<h && 0<=xx && xx<w && B[yy][xx]=='.'){
			res=max(res,dfs(t+1,yy,xx,S_next));
		}
	}
	return res;
}

int main(){
	for(;scanf("%d%d",&w,&h),w;){
		rep(i,h) rep(j,w) scanf(" %c",B[i]+j);
		scanf("%d",&n);
		rep(i,n) scanf("%d%d%d%d",id+i,val+i,s+i,g+i);

		rep(S,1<<n){
			val_sum[S]=0;
			rep(i,n) if(S&1<<i) val_sum[S]+=val[i];
		}

		int px,py;
		rep(i,h) rep(j,w) if(B[i][j]=='P') B[i][j]='.', px=j, py=i;

		rep(t,101) rep(i,h) rep(j,w) rep(S,1<<n) dp[t][i][j][S]=-1;
		printf("%d\n",dfs(0,py,px,0));
	}

	return 0;
}