#include<bits/stdc++.h>
using namespace std;
char map_1[205][205];
int n,m,k,c,food;
struct X_Y{
int x,y;
inline X_Y operator+(X_Y const & b){return {x+b.x,y+b.y};}
inline X_Y operator+=(X_Y const & b){return {x+=b.x,y+=b.y};}
template<class T> inline auto& get(T&t){return t[x][y];}
};
struct SNAKE{
static const constexpr auto map=map_1;
struct OPT{
static X_Y opts[256];
unsigned char opt[55],*p=opt;
static inline void init(){opts['W']={-1,0},opts['S']={1,0},opts['A']={0,-1},opts['D']={0,1};}
inline const X_Y front(){return opts[*p];}
inline const X_Y pop(){return opts[*(p++)];}
}opts;
bool is_die;
int num;
X_Y head;
queue<X_Y> body;
inline void opt_1(){
is_die=is_die|(head+opts.front()).get(map)=='#';
}
inline void opt_2(){
if(is_die){
for(food+=body.size();!body.empty();body.pop()) body.front().get(map)='&';
}else{
head+=opts.pop();;
body.push(head);
if(head.get(map)=='&') food--; else body.front().get(map)='.',body.pop();
head.get(map)='#';
}
}
static inline bool cmp(SNAKE const & a,SNAKE const & b){return a.body.size()!=b.body.size()?a.body.size()>b.body.size():a.num<b.num;}
}snake[25];
X_Y SNAKE::OPT::opts[256]={};
bool is_search[205][205];
void dfs (X_Y p,queue<X_Y>&q){
for(auto i:{p+X_Y{0,1},p+X_Y{0,-1},p+X_Y{1,0},p+X_Y{-1,0}})if((!i.get(is_search))&&i.get(map_1)=='#')i.get(is_search)=true,dfs(i,q);
q.push(p);
}
int main(){
SNAKE::OPT::init();
cin>>n>>m>>k;
for(int i=0;i<=n;i++) cin.getline(map_1[i]+1,m+1);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
if(map_1[i][j]=='&')food++;
else if(map_1[i][j]=='@'){
dfs(snake[c].head={i,j},snake[c].body);
snake[c].num=c+1;
c++;
}
}
for(int i=0;i<c;i++)snake[i].head.get(map_1)='#';
if(k)for(int i=0;i<c;i++)cin>>snake[i].opts.opt;
for(int i=0;i<=n;i++) map_1[i][0]=map_1[i][m+1]='#';
for(int i=0;i<=m;i++) map_1[0][i]=map_1[n+1][i]='#';
for(int i=0;i<k;i++){
for(int j=0;j<c;j++) snake[j].opt_1();
for(int j=0;j<c;j++) snake[j].opt_2();
}
sort(snake,snake+c,SNAKE::cmp);
for(int i=0;i<c;i++)cout<<snake[i].body.size()<<" "<<snake[i].num<<"\n";
cout<<food;
return 0;
}