#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool visit[1000005];
vector <ll> adj[1000005];
void dfs(ll x)
{
visit[x] = true;
if(visit[adj[x][0]] == false)
dfs(adj[x][0]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
ll n,m;
cin>>n>>m;
char ch;
ll k=0,ranjana=0;
char str[n][m];
ll count[n][m];
//vector <ll> adj[n*m+1];
for(ll i=0;i<n;i++)
{
for(ll j=0;j<m;j++)
{
cin>>ch;
str[i][j] = ch;
count[i][j] = k;
k++;
}
}
memset(visit,false,sizeof(visit));
ll val=0;
for(ll i=0;i<n;i++)
{
for(ll j=0;j<m;j++)
{
if(str[i][j]=='S' and i+1 < n)
val = count[i+1][j];
else if(str[i][j]=='N' and i-1 >=0)
val = count[i-1][j];
else if(str[i][j]=='E' and j+1 < m)
val = count[i][j+1];
else if(str[i][j]=='W' and j-1 >= 0)
val = count[i][j-1];
adj[count[i][j]].push_back(val);
}
}
for(int i=0;i<n*m;i++)
{
for(int j=0;j<adj[i].size();j++)
cout<<i<<"->>" <<adj[i][j]<<endl;
}
for(ll i=0;i<n*m ; i++)
{
if(visit[i]==false)
{
dfs(i);
ranjana++;
}
}
cout<<ranjana<<endl;
for(ll i=0;i<n*m;i++)
adj[i].clear();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpib29sIHZpc2l0WzEwMDAwMDVdOwp2ZWN0b3IgPGxsPiBhZGpbMTAwMDAwNV07CnZvaWQgZGZzKGxsIHgpCnsKCXZpc2l0W3hdID0gdHJ1ZTsKCWlmKHZpc2l0W2Fkalt4XVswXV0gPT0gZmFsc2UpCgkJZGZzKGFkalt4XVswXSk7Cn0gCgppbnQgbWFpbigpCnsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCWNpbi50aWUoTlVMTCk7CglsbCBuLG07CgljaW4+Pm4+Pm07CgljaGFyIGNoOwoJbGwgaz0wLHJhbmphbmE9MDsKCWNoYXIgc3RyW25dW21dOwoJbGwgY291bnRbbl1bbV07CgkvL3ZlY3RvciA8bGw+IGFkaltuKm0rMV07Cglmb3IobGwgaT0wO2k8bjtpKyspCgl7CgkJZm9yKGxsIGo9MDtqPG07aisrKQoJCXsKCQkJY2luPj5jaDsKCQkJc3RyW2ldW2pdID0gY2g7CgkJCWNvdW50W2ldW2pdID0gazsKCQkJaysrOwoJCX0KCX0KCW1lbXNldCh2aXNpdCxmYWxzZSxzaXplb2YodmlzaXQpKTsKCWxsIHZhbD0wOwoJZm9yKGxsIGk9MDtpPG47aSsrKQoJewoJCWZvcihsbCBqPTA7ajxtO2orKykKCQl7CgkJCWlmKHN0cltpXVtqXT09J1MnIGFuZCBpKzEgPCBuKQoJCQkJdmFsID0gY291bnRbaSsxXVtqXTsKCQkJZWxzZSBpZihzdHJbaV1bal09PSdOJyBhbmQgaS0xID49MCkKCQkJCXZhbCA9IGNvdW50W2ktMV1bal07CgkJCWVsc2UgaWYoc3RyW2ldW2pdPT0nRScgYW5kIGorMSA8IG0pCgkJCQl2YWwgPSBjb3VudFtpXVtqKzFdOwoJCQllbHNlIGlmKHN0cltpXVtqXT09J1cnIGFuZCBqLTEgPj0gMCkKCQkJCXZhbCA9IGNvdW50W2ldW2otMV07CgoJCQlhZGpbY291bnRbaV1bal1dLnB1c2hfYmFjayh2YWwpOwoJCX0KCX0KCWZvcihpbnQgaT0wO2k8biptO2krKykKCXsKCQlmb3IoaW50IGo9MDtqPGFkaltpXS5zaXplKCk7aisrKQoJCQljb3V0PDxpPDwiLT4+IiA8PGFkaltpXVtqXTw8ZW5kbDsKCX0KCWZvcihsbCBpPTA7aTxuKm0gOyBpKyspCgl7CgkJaWYodmlzaXRbaV09PWZhbHNlKQoJCXsKCQkJZGZzKGkpOwoJCQlyYW5qYW5hKys7CgkJfQoJfQoJY291dDw8cmFuamFuYTw8ZW5kbDsKCWZvcihsbCBpPTA7aTxuKm07aSsrKQoJCWFkaltpXS5jbGVhcigpOwoJCglyZXR1cm4gMDsKfQ==