/*
hdu1811 并查集 拓扑排序
Author:lcy
Time:2017-10-19
给出一组大于小于等于关系,判断其是否合法、矛盾或信息不足
如果只有大小关系,很容易想到拓扑排序来处理。
现在多了等于关系,那么可以先用并查集将所有相等的数合并,
再用拓扑排序即可。
注意如果矛盾和信息不足同时出现,输出矛盾。在这里WA了好久。
*/
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
#define idx(a) (a-'a')
using namespace std;
const int MAXN=10005;
const int MAXM=20005;
int fa[MAXN],e[MAXM],in[MAXN],sz;
int fir[MAXM],sec[MAXM],ed;
vector<int>g[MAXN];
int n,m;
void add_edge(int f,int t){
in[t]++;
g[f].pb(sz);
e[sz++]=t;
}
int find_fa(int x){
return fa[x]==x?x:find_fa(fa[x]);
}
void uni(int x,int y){
int fax=find_fa(x);
int fay=find_fa(y);
fa[fax]=fay;
}
inline void solve(){
int a,b;char c;
fr(i,1,m){
scfd(&a);
scanf(" %c",&c);
scfd(&b);
switch(c){
case '=':
uni(a,b);
break;
case '>':
fir[ed]=a,sec[ed]=b;
ed++;
break;
case '<':
fir[ed]=b,sec[ed]=a;
ed++;
break;
}
}
fr(i,0,ed-1)
add_edge(find_fa(fir[i]),find_fa(sec[i]));
int left=0;
fr(i,0,n-1)
if(find_fa(i)==i)
left++;
queue<int>q;
int cnt=0;
fr(i,0,n-1)
if(find_fa(i)==i&&!in[find_fa(i)]){
q.push(fa[i]);
cnt++;
}
bool f=false;
if(cnt>1)
f=true;
while(!q.empty()){
cnt=0;
int now=q.front();q.pop();
left--;
int size=g[now].size();
fr(i,0,size-1){
in[e[g[now][i]]]--;
if(!in[e[g[now][i]]]){
cnt++;
q.push(e[g[now][i]]);
}
}
if(cnt>1)
f=true;
}
if(left)
puts("CONFLICT");
else if(f)
puts("UNCERTAIN");
else
puts("OK");
}
inline void init(){
fr(i,0,n){g[i].clear(),fa[i]=i,in[i]=0;}
ed=sz=0;
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
solve();
}
return 0;
}