#include <bits/stdc++.h>
#include <experimental/random>
#include <random>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
using ld = long double;
using ll = long long;
const ll INF = 1e18, MOD = 1e9 + 7;
void solve();
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int q = 1;
//cin >> q;
while (q--) {
solve();
}
}
vector<vector<int>> g;
vector<int> mt;
vector<int> used;
int timer = 1;
bool kun(int v) {
if (used[v] == timer) {
return false;
}
used[v] = timer;
for (auto u : g[v]) {
if (mt[u] == -1 || kun(mt[u])) {
mt[u] = v;
return true;
}
}
return false;
}
void solve() {
int n, m;
cin >> n >> m;
vector<vector<char>> a(n, vector<char>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
vector<vector<int>> vert(n, vector<int>(m, -1));
int id = 0;
for (int i = 0; i + 2 < n; i++) {
for (int j = 0; j < m; j++) {
string s;
for (int c = 0; c < 3; c++) {
s += a[i + c][j];
}
if (s == "RGW") {
vert[i][j] = id++;
}
}
}
vector<vector<int>> gor(n, vector<int>(m, -1));
int id2 = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j + 2 < m; j++) {
string s;
for (int c = 0; c < 3; c++) {
s += a[i][j + c];
}
if (s == "RGW") {
gor[i][j] = id2++;
}
}
}
g.resize(id);
used.resize(id);
mt.resize(id2, -1);
vector<pair<int, int>> cord = {{0, 0}, {1, 0}, {2, 0},
{0, -1}, {1, -1}, {2, -1},
{0, -2}, {1, -2}, {2, -2}};
for (int i = 0; i + 2 < n; i++) {
for (int j = 0; j < m; j++) {
if (vert[i][j] == -1) continue;
for (auto [f1, f2] : cord) {
int x = i + f1, y = j + f2;
if (x < 0 || y < 0 || x == n || y == m) continue;
if (gor[x][y] != -1) {
g[vert[i][j]].push_back(gor[x][y]);
}
}
}
}
int ans = id + id2;
for (int i = 0; i < id; i++) {
if (kun(i)) {
ans--;
timer++;
}
}
cout << ans;
}