rt
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
const int N = 1005;
const string wd[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int m, n, p;
string names[N];
unordered_map<string, int> id;
pair<string, string> sen[N];
bool hon[N];
int judge(int day, int guy, string name, string content)
{
int k = id[name];
if (content == "I am guilty.")
{
if (k == guy) return 1;
return 2;
}
if (content == "I am not guilty.")
{
if (k != guy) return 1;
return 2;
}
for (int i = 0; i < m; i++)
if (names[i] + " is guilty." == content)
{
if (i == guy) return 1;
else return 2;
}
for (int i = 0; i < m; i++)
if (names[i] + " is not guilty." == content)
{
if (i == guy) return 2;
else return 1;
}
for (int i = 0; i < 7; i++)
if ("Today is " + wd[i] + "." == content)
{
if (i == day) return 1;
else return 2;
}
return 0;
}
bool check(int day, int guy)
{
for (int i = 0; i < p; i++)
{
string name = sen[i].first, content = sen[i].second;
int k = id[name];
hon[k] |= judge(day, guy, name, content);
}
int lie = 0, truth = 0;
for (int i = 0; i < m; i++)
if (hon[i] == 3) return false;
else if (hon[i] == 1) truth++;
else if (hon[i] == 2) lie++;
return lie <= n && truth <= m - n;
}
int main()
{
scanf("%d%d%d", &m, &n, &p);
for (int i = 0; i < m; i++)
{
cin >> names[i];
id[names[i]] = i;
}
for (int i = 0; i < p; i++)
{
string name, content;
cin >> name;
name.pop_back();
getline(cin, content);
content.erase(content.begin());
if (content.back() == '\r') content.pop_back();
sen[i] = {name, content};
}
vector<string> guys;
for (int day = 0; day < 7; day++)
{
for (int i = 0; i < m; i++)
{
if (check(day, i))
guys.push_back(names[i]);
}
if (!guys.empty()) break;
}
if (guys.empty()) cout << "Impossible";
else if (guys.size() > 1) cout << "Cannot Determine";
else cout << guys[0];
return 0;
}