//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
int read(char *s){
	R int len=0;R char ch;while(((ch=getc())>'Z'||ch<'A'));
	for(s[++len]=ch;(ch=getc())>='A'&&ch<='Z';s[++len]=ch);
	return s[len+1]='\0',len;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
    if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
vector<int>N,S,W,E;
int Pre(vector<int> &A,int x){
	if(A.empty())return 1;
	int l=0,r=A.size()-1,res=0;
	while(l<=r){
		int mid=(l+r)>>1;
		A[mid]<=x?(res=mid,l=mid+1):r=mid-1;
	}
	return A[res];
}
int suf(vector<int> &A,int x){
	if(A.empty())return 1;
	int l=0,r=A.size()-1,res=r;
	while(l<=r){
		int mid=(l+r)>>1;
		A[mid]>=x?(res=mid,r=mid-1):l=mid+1;
	}
	return A[res];
}
struct eg{int v,nx,w;}e[1005];int head[105],tot;
inline void add(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}
char s[100005],t[100005];int n,m,Q,cnt,id[25][25],dis[205],vis[205];
struct node{
	int u,d;
	node(){}
	node(R int uu,R int dd):u(uu),d(dd){}
	inline bool operator <(const node &b)const{return d>b.d;}
};priority_queue<node>q;
int spfa(int S,int T){
	fp(i,1,cnt)dis[i]=inf,vis[i]=0;
	q.push(node(S,0)),dis[S]=0;
	while(!q.empty()){
		int u=q.top().u;q.pop();if(vis[u])continue;vis[u]=1;
		go(u)if(cmin(dis[v],dis[u]+e[i].w))q.push(node(v,dis[v]));
	}
	return dis[T]<inf?dis[T]:-1;
}
int main(){
//	freopen("testdata.in","r",stdin);
	n=read(),m=read(),Q=read(),read(s),read(t);
	fp(i,1,n)s[i]=='E'?E.push_back(i):W.push_back(i);
	fp(i,1,m)t[i]=='S'?S.push_back(i):N.push_back(i);
	while(Q--){
		int a=read(),b=read(),c=read(),d=read();
		vector<int>X,Y;
		X.push_back(Pre(E,a)),X.push_back(Pre(W,a)),
		X.push_back(suf(E,a)),X.push_back(suf(W,a)),
		X.push_back(Pre(E,c)),X.push_back(Pre(W,c)),
		X.push_back(suf(E,c)),X.push_back(suf(W,c)),
		Y.push_back(Pre(S,b)),Y.push_back(Pre(N,b)),
		Y.push_back(suf(S,b)),Y.push_back(suf(N,b)),
		Y.push_back(Pre(S,d)),Y.push_back(Pre(N,d)),
		Y.push_back(suf(S,d)),Y.push_back(suf(N,d));
		sort(X.begin(),X.end()),X.resize(unique(X.begin(),X.end())-X.begin());
		sort(Y.begin(),Y.end()),Y.resize(unique(Y.begin(),Y.end())-Y.begin());
		int lx=X.size(),ly=Y.size(),S,T;cnt=0;
		fp(i,0,lx-1)fp(j,0,ly-1){
			id[i][j]=++cnt;
			if(X[i]==a&&Y[j]==b)S=cnt;
			if(X[i]==c&&Y[j]==d)T=cnt;
		}
		fp(i,1,cnt)head[i]=0;tot=0;
		fp(i,0,lx-1)
			if(s[X[i]]=='E')fp(j,0,ly-2)add(id[i][j],id[i][j+1],Y[j+1]-Y[j]);
			else fp(j,1,ly-1)add(id[i][j],id[i][j-1],Y[j]-Y[j-1]);
		fp(j,0,ly-1)
			if(t[Y[j]]=='S')fp(i,0,lx-2)add(id[i][j],id[i+1][j],X[i+1]-X[i]);
			else fp(i,1,lx-1)add(id[i][j],id[i-1][j],X[i]-X[i-1]);
		print(spfa(S,T));
	}
	return Ot(),0;
}

Measured memory_bytes: 6096