#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
struct hehe
{
long long lx,bh,rq,zfbh;//这个是证言情况的数组,lx是类型,zfbh是罪犯编号,rq是日期,bh是证人编号。
}sz[205];
string pdrq[10]={" ","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday.","Today is Sunday."};//打表判断周几
long long n,m,p,bqc,sjhd,xs,bcl;//bqc是不清楚的意思,表示有多少人一直说胡话。sjhd是说假话的,这个名字很清楚吧。
string name,zname,s[100];
string zy;
map<string,int>ys;
map<string,int>mp;
int main()
{
cin>>m>>n>>p;
for(int i=1;i<=m;i++)
{
cin>>s[i];//读入名字
mp[s[i]]=i;//本名字的编号为i
}
for(int i=1;i<=p;i++)
{
cin>>name;//输入名字,他输入证言是“名字+:+空格+证言+回车 ”我为什么打回车先按下不表,等等再说。
zname="";
for(int j=0;j<name.length()-1;j++)
{
zname+=name[j];//zname才是name,name是名字+:
}
sz[i].bh=mp[zname];
getline(cin,zy);//带空格我选getline。
zy.erase(zy.end()-1);//截取,就是删掉后面的回车(评测姬和我的情况不一样导致的)
for(int j=1;j<=7;j++)
{
if(zy==" "+pdrq[j])//他在说日期哎
{
sz[i].lx=1;//lx为1
sz[i].rq=j;//日期为j
}
}
int bj=0;
if(zy==" I am guilty.")//他在说罪犯哎
{
sz[i].zfbh=mp[zname];
sz[i].lx=2;
}else if(zy==" I am not guilty.")//他在说清白的人哎
{
sz[i].zfbh=mp[zname];
sz[i].lx=3;
}else
{
for(int j=1;j<=m;j++)
{
if(zy==" "+s[j]+" is guilty.")//他在说罪犯哎
{
sz[i].zfbh=j;
sz[i].lx=2;
}else if(zy==" "+s[j]+" is not guilty.")//他在说清白的人哎
{
sz[i].zfbh=j;
sz[i].lx=3;
}
}
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=7;j++)//暴力枚举罪犯编号和日期
{
bcl=0;
for(int u=1;u<=m;u++)//初始化
{
ys[s[u]]=0;
}
for(int u=1;u<=p;u++)
{
if(sz[u].lx1)//判断证言类型
{
if(sz[u].rqj)
{
if(ys[s[sz[u].bh]]0)
{
ys[s[sz[u].bh]]=1;
}else if(ys[s[sz[u].bh]]!=1)//前后不符,就是也说真话也说假话(后面的差不多一样,不写了)
{
bcl=1;
}
}else
{
if(ys[s[sz[u].bh]]0)
{
ys[s[sz[u].bh]]=-1;
}else if(ys[s[sz[u].bh]]!=-1)
{
bcl=1;
}
}
}else if(sz[u].lx2)
{
if(sz[u].zfbhi)
{
if(ys[s[sz[u].bh]]==0)
{
ys[s[sz[u].bh]]=1;
}else if(ys[s[sz[u].bh]]!=1)
{
bcl=1;
}
}else
{
if(ys[s[sz[u].bh]]0)
{
ys[s[sz[u].bh]]=-1;
}else if(ys[s[sz[u].bh]]!=-1)
{
bcl=1;
}
}
}else if(sz[u].lx3)
{
if(sz[u].zfbh!=i)
{
if(ys[s[sz[u].bh]]0)
{
ys[s[sz[u].bh]]=1;
}else if(ys[s[sz[u].bh]]!=1)
{
bcl=1;
}
}else
{
if(ys[s[sz[u].bh]]0)
{
ys[s[sz[u].bh]]=-1;
}else if(ys[s[sz[u].bh]]!=-1)
{
bcl=1;
}
}
}
}
if(bcl1)//这个设定是不合理的。
{
continue;
}
bqc=0;
sjhd=0;
for(int u=1;u<=m;u++)//判断说谎的人和不确定的人。
{
if(ys[s[u]]0)
{
bqc++;
}
if(ys[s[u]]-1)
{
sjhd++;
}
}
if(sjhd<=n&&bqc+sjhd>=n)//合理
{
if(xs!=i&&xs!=0)//之前有过不一样的凶手,也就是说凶手可能有多个,不符合题目描述,退出。
{
cout<<"Cannot Determine"<<endl;
exit(0);
}
xs=i;//这是唯一的凶手
}
}
}
if(xs0)//根本没有凶手
{
cout<<"Impossible"<<endl;
exit(0);
}
cout<<s[xs];//输出
return 0;
}