#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
#include <utility>
#include <map>
#include <set>
#include <string>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define N (1000010)
#define M ()
#define MP make_pair
#define PB push_back
#define FI first
#define SE second
int dis[N], op[N], pa[N], pb[N];
int NN, MM;
const int dx[4] = {0,0,-1,1};
const int dy[4] = {-1,1,0,0};
const int A = 23;
const int B = 31;

#define MD (1000000007)
int cx, cy;
int n, m, k;
char ts[N];
void init(){
	pa[0] = pb[0] = 1;
	for (int i = 1; i < N; ++i){
		pa[i] = 1ll * pa[i-1] * A % MD;
		pb[i] = 1ll * pb[i-1] * B % MD;
	}
}
struct hashtable{
	LL hashvalue;
	hashtable(){hashvalue = 0;}
	void insert(int x, int y){
		//printf("hins %d %d\n", x, y);
		hashvalue = (hashvalue + 1ll * pa[x] * pb[y]) % MD;
	}
}h0, h1, h2;
struct crosslinklist{
	vector <int> col[N], row[N], a[N];
	int next(int &x, int &y, int d){
		int l, r, mid;
		if (d == 0){
			l = 0, r = y;
			while (l + 1 < r){
				mid = l + r >> 1;
				if (srow(x, mid, y) == a[x][y]){
					r = mid;
				}
				else {
					l = mid;
				}
			}
			d = y - l;
			del(x,y);
			y = l;
			return d;
		}
		if (d == 1){
			l = y, r = m+1;
			while (l + 1 < r){
				mid = l +r >> 1;
				if (srow(x,y,mid) == a[x][y]){
					l = mid;
				}
				else {
					r = mid;
				}
			}
			d = r - y;
			del(x,y);
			y = r;
			return d;
		}
		if (d == 2){
			l = 0, r = x;
			while (l + 1 < r){
				mid = l + r >> 1;
				if (scol(y,mid,x) == a[x][y]){
					r = mid;
				}
				else {
					l = mid;
				}
			}
			d = x - l;
			del(x,y);
			x = l;
			return d;
		}
		if (d == 3){
			l = x, r = n+1;
			while (l + 1 < r){
				mid = l + r >> 1;
				if (scol(y, x, mid) == a[x][y]){
					l = mid;
				}
				else {
					r = mid;
				}
			}
			//printf("%d %d %d\n", x, y, r);
			d = r - x;
			del(x,y);
			x  = r;
			return d;
		}
	}
	int srow(int x, int l, int r){	
		x++, r++;
		int res = 0;
		for (; r; r -= r &-r){
			res += row[x][r];
		}
		for (; l; l -= l &-l){
			res -= row[x][l];
		}
		return res;
	}
	int scol(int y, int l, int r){
		++y, ++r;
		int res = 0;
		for (; r; r -= r &-r){
			res += col[y][r];
		}
		for (;l;l-=l &-l){
			res -= col[y][l];
		}
		return res;
	}
	void del(int x, int y){
		//printf("delete %d %d\n", x, y);
		++x, ++y;
		if (!a[x][y]) return;
		a[x][y] = 0;
		for (int i = y; i < MM; i+=i&-i){
			--row[x][i];
		}
		for (int i = x; i < NN; i += i &-i){
			--col[y][i];
		}
	}
	void ins(int x, int y){
		//printf("%d %d\n", x, y);
		//printf("insert %d %d\n", x, y);
		++x, ++y;
		//printf("%d %d\n", x, y);
		if (a[x][y]) return;
		a[x][y] = 1;
		for (int i = y; i < MM; i += i &-i){
			++row[x][i];
		}
		for (int i = x; i < NN; i += i &-i){
			++col[y][i];
		}
	}
	void setfull(){
		for (int i = 0; i <= n + 2; ++i){
			for (int j = 0; j <= m + 2; ++j){
				a[i].PB(j);
				row[i].PB(j);
			}
		}
		for (int j = 0; j <= m + 2; ++j){
			for (int i = 0; i <= n + 2; ++i){
				col[j].PB(i);
			}
		}
		for (int i = 0; i <= n + 1; ++i){
			for (int j = 0; j <= m+1; ++j){
				ins(i,j);
			}
		}
	}
} t1, t2;
LL ans1, ans2, clab;
void pro(int i, int d, int dis){
	static int first = 1;
	for (int ux, uy, td, tx = cx, ty = cy, cd = 0; cd <= dis; ){
		ux = tx, uy = ty;
		if (!(!first && (tx == cx && ty == cy))){
			h1.insert(tx, ty);
			if (h1.hashvalue == h0.hashvalue && ans1 == -1)  ans1 = clab;
		}
		td = t1.next(tx, ty, d);
		printf("Txy %d %d %d\n", tx, ty, td);
		cd += td, clab += td;
	}
	first = 0;
	cx += dis * dx[d];
	cy += dis * dy[d];
}
void rev(int i, int d, int dis){
	static int first = 1;
	for (int ux, uy, td, tx = cx, ty = cy, cd = 0; cd <= dis; ){
		if (!(!first && (tx == cx && cy == ty))) {
			h2.insert(tx, ty);
			if (h2.hashvalue == h0.hashvalue && ans1 == -1)  ans1 = clab;
		}
		ux = tx, uy = ty;
		td = t2.next(tx, ty, d);
		cd += td, clab -= td;
	}
	first = 0;
	cx += dis * dx[d];
	cy += dis * dy[d];
}
/*bool operator == (const hashtable &a, const hashtable &b){
	return a.hashvalue == b.hashvalue;
}*/
int main(){	
	init();
	scanf("%d%d%d", &n, &m, &k);
	NN = n + 10, MM = m + 10;
	/*
	}*/
	for (int i = 1; i <= n; ++i){
		scanf("%s", ts);
		int n = strlen(ts);
		for (int j = 0; j < m; ++j){
			if (ts[j] == '#'){
				h0.insert(i,j+1);
			}
		}
	}
	t1.setfull();
	t2.setfull();
	//printf("---");
	cx = n, cy = 1;
	ans1 = ans2 = -1;
	// ans1 = 0
	if (h0.hashvalue == h1.hashvalue){
		ans1 = 0;
	}
	for (int i = 1; i <= k; ++i){
		scanf("%s%d", ts, dis+i);
		if (ts[0] == 'l') op[i] = 0;
		if (ts[0] == 'u') op[i] = 2;
		if (ts[0] == 'r') op[i] = 1;
		if (ts[0] == 'd') op[i] = 3;
		pro(i, op[i], dis[i]);
		printf("cxy %d %d\n", cx, cy);
	}
	printf("%lld %lld\n", h0.hashvalue, h1.hashvalue);
	if (h2.hashvalue == h0.hashvalue){
		ans2 = clab;
	}
	// ans2 = clab
	for (int i = k; i; --i){
		rev(i, op[i]^1, dis[i]);
		printf("%d %d\n", cx, cy);
	}
	printf("%lld %lld\n", ans1, ans2);
}

