//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
 
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
using namespace std;
//Macro
#define rep(i,a,b)  for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x)   for(__typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define read()  (strtol(ipos,&ipos,10))
#define sqr(x)  ((x)*(x))
#define pb  push_back
#define PS  system("pause");
typedef long long   ll;
typedef pair<int,int> pii;
const int oo=~0U>>2;
const double inf=1e100;
const double eps=1e-6;
string name="", in=".in", out=".out";
//Var
struct MonoQueue
{
    deque<pii> s;
    void clear(){s.clear();}
    void Insert(int x,int y)
    {
        while(!s.empty()&&s.back().second<y)s.pop_back();
        s.push_back(pii(x,y));
    }
    int Get(int time,int limit)
    {
        while(!s.empty()&&time-s.front().first>limit)s.pop_front();
        return s.front().second;
    }
}Q;
struct S
{
    int st,t,dir;
    bool operator <(const S &o)const{return st<o.st;}
}seg[208];
int f[2][208][208];
bool forbid[208][208];
int n,m,X,Y,K,ans;
void Init()
{
    scanf("%d%d%d%d%d",&n,&m,&X,&Y,&K);
    char ch;
    rep(i,1,n)rep(j,1,m)
    {
        cin>>ch;forbid[i][j]=ch=='x';
        f[0][i][j]=-oo;
    }
    f[0][X][Y]=0;
    rep(i,1,K)
        scanf("%d%d%d",&seg[i].st,&seg[i].t,&seg[i].dir),seg[i].t-=seg[i].st-1;
    sort(seg+1,seg+1+K);
}
void Update(int time,int now,int x,int y,int k)
{
    if(forbid[x][y]){f[now][x][y]=-oo;Q.clear();return;}
    Q.Insert(time,f[now^1][x][y]-time);
    f[now][x][y]=Q.Get(time,seg[k].t)+time;
    ans=max(ans,f[now][x][y]);
}
void Work()
{
    int now=0;
    rep(i,1,K)
    {
        now^=1;
        if(seg[i].dir==1)
            rep(y,1,m)
            {
                Q.clear();
                drep(x,n,1)
                    Update(n-x,now,x,y,i);
            }
        else if(seg[i].dir==2)
            rep(y,1,m)
            {
                Q.clear();
                rep(x,1,n)
                    Update(x-1,now,x,y,i);
            }
        else if(seg[i].dir==3)
            rep(x,1,n)
            {
                Q.clear();
                drep(y,m,1)
                    Update(m-y,now,x,y,i);
            }
        else
            rep(x,1,n)
            {
                Q.clear();
                rep(y,1,m)
                    Update(y-1,now,x,y,i);
            }
    }
    cout<<ans<<endl;
}
int main()
{
//  freopen((name+in).c_str(),"r",stdin);
//  freopen((name+out).c_str(),"w",stdout);
    Init();
    Work();
    return 0;
}