#include <cstdio>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
int R, C, N;
vector<string> names;
vector<int> status; // 0 = GOODBOY, 1 = DISRUPTIVE
map<string,int> id;
vector<pair<int,int>> friendships;
vector<pair<int,int>> rivalries;
vector<vector<int>> adj; // adjacency list for grid
int bestAns = -1;
vector<int> seat; // seat[pos] = student index
// cek validitas partial assignment
bool validSoFar(int pos) {
int stu = seat[pos];
for (int nb : adj[pos]) {
if (nb >= pos) continue; // only check filled neighbors
int other = seat[nb];
if (other == -1) continue;
// Rule 1: rivals cannot be adjacent
for (auto &rv : rivalries) {
if ((rv.first == stu && rv.second == other) ||
(rv.second == stu && rv.first == other))
return false;
}
// Rule 2: both disruptive cannot be adjacent
if (status[stu] == 1 && status[other] == 1)
return false;
}
return true;
}
void dfs(int pos, vector<int>& used) {
if (pos == R*C || (int)used.size() == N) {
// check friendship satisfaction
int cnt = 0;
for (auto &fr : friendships) {
int a = -1, b = -1;
for (int i = 0; i < R*C; i++) {
if (seat[i] == fr.first) a = i;
if (seat[i] == fr.second) b = i;
}
if (a != -1 && b != -1) {
for (int nb : adj[a]) {
if (nb == b) { cnt++; break; }
}
}
}
bestAns = max(bestAns, cnt);
return;
}
if (pos >= R*C) return;
// coba kosongkan kursi (kalau N < R*C)
seat[pos] = -1;
dfs(pos+1, used);
seat[pos] = -1;
// coba tempatkan siswa yang belum dipakai
for (int s = 0; s < N; s++) {
if (find(used.begin(), used.end(), s) != used.end()) continue;
seat[pos] = s;
if (validSoFar(pos)) {
used.push_back(s);
dfs(pos+1, used);
used.pop_back();
}
seat[pos] = -1;
}
}
int main() {
scanf("%d %d", &R, &C);
scanf("%d", &N);
names.resize(N);
status.resize(N);
for (int i = 0; i < N; i++) {
char nm[20], st[20];
scanf("%s %s", nm, st);
names[i] = nm;
id[names[i]] = i;
status[i] = (st[0] == 'D'); // DISRUPTIVE -> 1
}
int F; scanf("%d", &F);
friendships.resize(F);
for (int i = 0; i < F; i++) {
char a[20], b[20];
scanf("%s %s", a, b);
friendships[i] = {id[a], id[b]};
}
int V; scanf("%d", &V);
rivalries.resize(V);
for (int i = 0; i < V; i++) {
char a[20], b[20];
scanf("%s %s", a, b);
rivalries[i] = {id[a], id[b]};
}
// build adjacency
int total = R*C;
adj.assign(total, {});
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
int idx = r*C + c;
if (r > 0) adj[idx].push_back((r-1)*C + c);
if (r < R-1) adj[idx].push_back((r+1)*C + c);
if (c > 0) adj[idx].push_back(r*C + (c-1));
if (c < C-1) adj[idx].push_back(r*C + (c+1));
}
}
seat.assign(total, -1);
vector<int> used;
dfs(0, used);
if (bestAns == -1) printf("Impossible\n");
else printf("%d\n", bestAns);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBSLCBDLCBOOwp2ZWN0b3I8c3RyaW5nPiBuYW1lczsKdmVjdG9yPGludD4gc3RhdHVzOyAvLyAwID0gR09PREJPWSwgMSA9IERJU1JVUFRJVkUKbWFwPHN0cmluZyxpbnQ+IGlkOwoKdmVjdG9yPHBhaXI8aW50LGludD4+IGZyaWVuZHNoaXBzOwp2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gcml2YWxyaWVzOwoKdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGo7IC8vIGFkamFjZW5jeSBsaXN0IGZvciBncmlkCgppbnQgYmVzdEFucyA9IC0xOwp2ZWN0b3I8aW50PiBzZWF0OyAvLyBzZWF0W3Bvc10gPSBzdHVkZW50IGluZGV4CgovLyBjZWsgdmFsaWRpdGFzIHBhcnRpYWwgYXNzaWdubWVudApib29sIHZhbGlkU29GYXIoaW50IHBvcykgewogICAgaW50IHN0dSA9IHNlYXRbcG9zXTsKICAgIGZvciAoaW50IG5iIDogYWRqW3Bvc10pIHsKICAgICAgICBpZiAobmIgPj0gcG9zKSBjb250aW51ZTsgLy8gb25seSBjaGVjayBmaWxsZWQgbmVpZ2hib3JzCiAgICAgICAgaW50IG90aGVyID0gc2VhdFtuYl07CiAgICAgICAgaWYgKG90aGVyID09IC0xKSBjb250aW51ZTsKICAgICAgICAvLyBSdWxlIDE6IHJpdmFscyBjYW5ub3QgYmUgYWRqYWNlbnQKICAgICAgICBmb3IgKGF1dG8gJnJ2IDogcml2YWxyaWVzKSB7CiAgICAgICAgICAgIGlmICgocnYuZmlyc3QgPT0gc3R1ICYmIHJ2LnNlY29uZCA9PSBvdGhlcikgfHwKICAgICAgICAgICAgICAgIChydi5zZWNvbmQgPT0gc3R1ICYmIHJ2LmZpcnN0ID09IG90aGVyKSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gUnVsZSAyOiBib3RoIGRpc3J1cHRpdmUgY2Fubm90IGJlIGFkamFjZW50CiAgICAgICAgaWYgKHN0YXR1c1tzdHVdID09IDEgJiYgc3RhdHVzW290aGVyXSA9PSAxKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBkZnMoaW50IHBvcywgdmVjdG9yPGludD4mIHVzZWQpIHsKICAgIGlmIChwb3MgPT0gUipDIHx8IChpbnQpdXNlZC5zaXplKCkgPT0gTikgewogICAgICAgIC8vIGNoZWNrIGZyaWVuZHNoaXAgc2F0aXNmYWN0aW9uCiAgICAgICAgaW50IGNudCA9IDA7CiAgICAgICAgZm9yIChhdXRvICZmciA6IGZyaWVuZHNoaXBzKSB7CiAgICAgICAgICAgIGludCBhID0gLTEsIGIgPSAtMTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSKkM7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHNlYXRbaV0gPT0gZnIuZmlyc3QpIGEgPSBpOwogICAgICAgICAgICAgICAgaWYgKHNlYXRbaV0gPT0gZnIuc2Vjb25kKSBiID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYSAhPSAtMSAmJiBiICE9IC0xKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBuYiA6IGFkalthXSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuYiA9PSBiKSB7IGNudCsrOyBicmVhazsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJlc3RBbnMgPSBtYXgoYmVzdEFucywgY250KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAocG9zID49IFIqQykgcmV0dXJuOwoKICAgIC8vIGNvYmEga29zb25na2FuIGt1cnNpIChrYWxhdSBOIDwgUipDKQogICAgc2VhdFtwb3NdID0gLTE7CiAgICBkZnMocG9zKzEsIHVzZWQpOwogICAgc2VhdFtwb3NdID0gLTE7CgogICAgLy8gY29iYSB0ZW1wYXRrYW4gc2lzd2EgeWFuZyBiZWx1bSBkaXBha2FpCiAgICBmb3IgKGludCBzID0gMDsgcyA8IE47IHMrKykgewogICAgICAgIGlmIChmaW5kKHVzZWQuYmVnaW4oKSwgdXNlZC5lbmQoKSwgcykgIT0gdXNlZC5lbmQoKSkgY29udGludWU7CiAgICAgICAgc2VhdFtwb3NdID0gczsKICAgICAgICBpZiAodmFsaWRTb0Zhcihwb3MpKSB7CiAgICAgICAgICAgIHVzZWQucHVzaF9iYWNrKHMpOwogICAgICAgICAgICBkZnMocG9zKzEsIHVzZWQpOwogICAgICAgICAgICB1c2VkLnBvcF9iYWNrKCk7CiAgICAgICAgfQogICAgICAgIHNlYXRbcG9zXSA9IC0xOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIHNjYW5mKCIlZCAlZCIsICZSLCAmQyk7CiAgICBzY2FuZigiJWQiLCAmTik7CgogICAgbmFtZXMucmVzaXplKE4pOwogICAgc3RhdHVzLnJlc2l6ZShOKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgY2hhciBubVsyMF0sIHN0WzIwXTsKICAgICAgICBzY2FuZigiJXMgJXMiLCBubSwgc3QpOwogICAgICAgIG5hbWVzW2ldID0gbm07CiAgICAgICAgaWRbbmFtZXNbaV1dID0gaTsKICAgICAgICBzdGF0dXNbaV0gPSAoc3RbMF0gPT0gJ0QnKTsgLy8gRElTUlVQVElWRSAtPiAxCiAgICB9CgogICAgaW50IEY7IHNjYW5mKCIlZCIsICZGKTsKICAgIGZyaWVuZHNoaXBzLnJlc2l6ZShGKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRjsgaSsrKSB7CiAgICAgICAgY2hhciBhWzIwXSwgYlsyMF07CiAgICAgICAgc2NhbmYoIiVzICVzIiwgYSwgYik7CiAgICAgICAgZnJpZW5kc2hpcHNbaV0gPSB7aWRbYV0sIGlkW2JdfTsKICAgIH0KCiAgICBpbnQgVjsgc2NhbmYoIiVkIiwgJlYpOwogICAgcml2YWxyaWVzLnJlc2l6ZShWKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVjsgaSsrKSB7CiAgICAgICAgY2hhciBhWzIwXSwgYlsyMF07CiAgICAgICAgc2NhbmYoIiVzICVzIiwgYSwgYik7CiAgICAgICAgcml2YWxyaWVzW2ldID0ge2lkW2FdLCBpZFtiXX07CiAgICB9CgogICAgLy8gYnVpbGQgYWRqYWNlbmN5CiAgICBpbnQgdG90YWwgPSBSKkM7CiAgICBhZGouYXNzaWduKHRvdGFsLCB7fSk7CiAgICBmb3IgKGludCByID0gMDsgciA8IFI7IHIrKykgewogICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQzsgYysrKSB7CiAgICAgICAgICAgIGludCBpZHggPSByKkMgKyBjOwogICAgICAgICAgICBpZiAociA+IDApIGFkaltpZHhdLnB1c2hfYmFjaygoci0xKSpDICsgYyk7CiAgICAgICAgICAgIGlmIChyIDwgUi0xKSBhZGpbaWR4XS5wdXNoX2JhY2soKHIrMSkqQyArIGMpOwogICAgICAgICAgICBpZiAoYyA+IDApIGFkaltpZHhdLnB1c2hfYmFjayhyKkMgKyAoYy0xKSk7CiAgICAgICAgICAgIGlmIChjIDwgQy0xKSBhZGpbaWR4XS5wdXNoX2JhY2socipDICsgKGMrMSkpOwogICAgICAgIH0KICAgIH0KCiAgICBzZWF0LmFzc2lnbih0b3RhbCwgLTEpOwogICAgdmVjdG9yPGludD4gdXNlZDsKICAgIGRmcygwLCB1c2VkKTsKCiAgICBpZiAoYmVzdEFucyA9PSAtMSkgcHJpbnRmKCJJbXBvc3NpYmxlXG4iKTsKICAgIGVsc2UgcHJpbnRmKCIlZFxuIiwgYmVzdEFucyk7CiAgICByZXR1cm4gMDsKfQo=