#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//未处理0,可能轻-1,可能重2,真1
//=说明两边都是真;不等号说明假在两边,其他真;同一硬币两次判断相反说明真。
//只对未测和非真进行统计,数目为一则输出结果,否则输出零。
vector<int>weight;
int n;
void deal() {
int a;
cin >> a;
vector<int>left(a), right(a);
for (int j = 0; j < a; j++) {
cin >> left[j];
}
for (int j = 0; j < a; j++) {
cin >> right[j];
}
char op;
cin >> op;
if(op=='='){
for(int w:left){
weight[w]=1;
}
for(int w:right){
weight[w]=1;
}
}
else if(op=='<'){
for(int w:left){
if(weight[w]==0) weight[w]=-1;
else if(weight[w]==2) weight[w]=1;
}
for(int w:right){
if(weight[w]==0) weight[w]=2;
else if(weight[w]==-1) weight[w]=1;
}
for(int i=1;i<=n;i++){//出现不等号说明其他硬币都是真的
if(find(left.begin(),left.end(),i)==left.end()&&find(right.begin(),right.end(),i)==right.end()){
weight[i]=1;
}
}
}
else if(op=='>'){
for(int w:left){
if(weight[w]==0) weight[w]=2;
else if(weight[w]==-1) weight[w]=1;
}
for(int w:right){
if(weight[w]==0) weight[w]=-1;
else if(weight[w]==2) weight[w]=1;
}
for(int i=1;i<=n;i++){
if(find(left.begin(),left.end(),i)==left.end()&&find(right.begin(),right.end(),i)==right.end()){
weight[i]=1;
}
}
}
}
int main() {
int k;
while (cin >> n >> k) { // 注意 while 处理多个 case
weight=vector<int>(n+1,0);
for (int i = 0; i < k; i++) {
deal();
}
vector<int>res(4,0);
int f;
for(int i=1;i<=n;i++){
res[weight[i]+1]++;
if(weight[i]!=1){
f=i;
}
}
if(res[2]!=n-1){
cout<<0<<endl;
}
else{
cout<<f<<endl;
}
}
}
// 64 位输出请用 printf("%lld")