// Fuck t*h's cache'
#include "testlib.h"
#include <cstdlib>
#include <map>
#include <string>
#include <tuple>

const char *NO_SOL = "No Solution!";
const int MAXN = 103;

int n, v;
std::string city[MAXN];
std::map<std::string, int> id;
bool g[MAXN][MAXN] = {{ false }};

int route[MAXN];
bool vis[MAXN];

typedef std::tuple<int, TResult, std::string> answer_t;

answer_t read_answer(InStream &ouf)
{
    std::string m_str = ouf.readLine();
    int m = -1;

    if (m_str == NO_SOL) return answer_t(-1, _ok, "" );
    m = strtol(m_str.c_str(), NULL, 10) + 1;

    for (int i = 0; i < m; ++i) {
        std::string s = ouf.readToken();
        std::map<std::string, int>::iterator p = id.find(s);
        if (p == id.end()) {
            return answer_t(m, _wa, "Nonexistent city name " + s);
        }
        route[i] = p->second;
    }
    for (int i = 0; i < n; ++i) vis[i] = false;
    int phase = 0;
    for (int i = 0; i < m; ++i) {
        if (vis[route[i]]) {
            return answer_t(m, _wa, "Non-westernmost city " + city[route[i]] + " should not be visited more than once");
        }
        vis[route[i]] = true;
        if (i == 0) {
            if (route[i] != 0) {
                return answer_t(m, _wa, "First city should be the westernmost one " + city[0]);
            }
            vis[route[i]] = false;  // Will be visited twice
        } else {
            if (!g[route[i - 1]][route[i]]) {
                return answer_t(m, _wa, "Nonexistent flight " + city[route[i - 1]] + "-" + city[route[i]]);
            } else if ((phase == 0) ^ (route[i] > route[i - 1])) {
                return answer_t(m, _wa, "Incorrect direction " + city[route[i - 1]] + "-" + city[route[i]]);
            }
            if (route[i] == n - 1) phase = 1;
        }
    }
    if (phase == 0) {
        return answer_t(m, _wa, "Didn't reach the easternmost city " + city[n - 1]);
    }
    if (route[m - 1] != 0) {
        return answer_t(m, _wa, "Last city should be the westernmost one " + city[0]);
    }

    return answer_t(m, _ok, "");
}

int main(int argc, char *argv[])
{
    registerTestlibCmd(argc, argv);

    n = inf.readInt();
    v = inf.readInt();
    for (int i = 0; i < n; ++i) {
        city[i] = inf.readToken();
        id[city[i]] = i;
    }
    for (int i = 0; i < v; ++i) {
        std::string s = inf.readToken();
        std::string t = inf.readToken();
        g[id[s]][id[t]] = g[id[t]][id[s]] = true;
    }

    auto jury_ans = read_answer(ans);
    auto ptcp_ans = read_answer(ouf);

    if (std::get<1>(jury_ans) != _ok) {
        quitf(_fail, "Jury's answer is invalid: %s", std::get<2>(jury_ans).c_str());
    }
    if (std::get<1>(ptcp_ans) != _ok) {
        quitf(std::get<1>(ptcp_ans), "Invalid: %s", std::get<2>(ptcp_ans).c_str());
    }
    if (std::get<0>(jury_ans) > std::get<0>(ptcp_ans)) {
        quitf(_wa, "Participant's answer is suboptimal");
    } else if (std::get<0>(jury_ans) < std::get<0>(ptcp_ans)) {
        quitf(_fail, "Jury's answer is suboptimal! O O");
    }

    quitf(_ok, "*\\(^ ^)/*");
    return 0;
}