#include <bits/stdc++.h>
using namespace std;
const int maxnm = 1003;
int N, M, fx, fy, bx, by, lx, ly, dp[maxnm][maxnm], disx, disy, last;
char ci;
typedef struct node {
int x, y;
} p;
p fj[maxnm], be[maxnm];
int main(void) {
ios::sync_with_stdio(false);
cin >> N >> M;
cin >> fx >> fy;
cin >> bx >> by;
lx = fx, ly = fy;
fj[0].x = lx, fj[0].y = ly;
for (int i = 1; i <= N; ++i) {
cin >> ci;
if (ci == 'N') {
++ly;
}
else if (ci == 'E') {
++lx;
}
else if (ci == 'S') {
--ly;
}
else {
--lx;
}
fj[i].x = lx, fj[i].y = ly;
}
lx = bx, ly = by;
be[0].x = lx, be[0].y = ly;
for (int i = 1; i <= N; ++i) {
cin >> ci;
if (ci == 'N') {
++ly;
}
else if (ci == 'E') {
++lx;
}
else if (ci == 'S') {
--ly;
}
else {
--lx;
}
be[i].x = lx, be[i].y = ly;
}
for (int i = 1; i <= M; ++i) {
disx = abs(be[i].x - fx);
disy = abs(be[i].y - fy);
dp[0][i] = pow(disx, 2) + pow(disy, 2) + dp[0][i - 1];
}
for (int i = 1; i <= N; ++i) {
disx = abs(fj[i].x - bx);
disy = abs(fj[i].y - by);
dp[i][0] = pow(disx, 2) + pow(disy, 2) + dp[i - 1][0];
last = dp[i][0];
}
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
disx = abs(fj[i].x - be[j].x);
disy = abs(fj[i].y - be[i].y);
dp[i][j] = min(dp[i - 1][j - 1] , min(dp[i][j - 1] , dp[i - 1][j])) + (pow(disx, 2) + pow(disy, 2));
}
}
printf("%d", dp[N][M]);
return 0;
}