1 /************************
2 * zhuyuqi *
3 * QQ 1113865149 *
4 * worfzyq@gmail.com *
5 *************************/
6 #include <cstdio>
7 #include <cstring>
8 #include <algorithm>
9 #include <queue>
10 #include <vector>
11 using namespace std;
12 const int MAX = 10000+10;
13 vector<int> G[MAX];
14 queue<int> Q;
15 int pa[MAX],a[MAX],b[MAX],in[MAX];
16 int ans;
17 char c[MAX][4];
18 void make(int n) {
19 for(int i=0;i<n;i++) pa[i]=i;
20 }
21
22 int find(int x) {
23 if(pa[x]!=x) pa[x]=find(pa[x]);
24 return pa[x];
25 }
26
27 void Union(int a,int b) {
28 int x=find(a); int y=find(b);
29 if(x!=y) pa[x]=y,ans--;
30 }
31
32 void init() {
33 for(int i=0;i<MAX;i++) G[i].clear();
34 while(!Q.empty()) Q.pop();
35 memset(in,0,sizeof(in));
36 }
37
38 void add_edge(int from,int to) {
39 G[from].push_back(to);
40 }
41
42 int check(int n) {
43 int cnt=0; int sum=0;
44 for(int i=0;i<n;i++) if(!in[i]&&find(i)==i) {
45 cnt++;
46 Q.push(i);
47 }
48 int flag=0;
49 if(cnt>1) flag=1;
50 while(!Q.empty()) {
51 sum++;
52 int p=Q.front(); Q.pop(); int tot=0;
53 //printf(".....%d",G[p].size());
54 for(int j=0;j<G[p].size();j++) {
55 if(--in[G[p][j]]==0) {
56 tot++; Q.push(G[p][j]);
57 }
58 }
59 if(tot>1) flag=1;
60 }
61 //printf("%d\n",ans);
62 if(sum<ans) flag=2;
63 return flag;
64 }
65
66 int main()
67 {
68 int n,m;
69 while(scanf("%d %d",&n,&m)==2) {
70 make(n); init(); ans=n;
71 for(int i=0;i<m;i++) {
72 scanf("%d %s %d",&a[i],c[i],&b[i]);
73 if(c[i][0]==‘=‘) Union(a[i],b[i]);
74 }
75 // printf("%d\n",ans);
76 for(int i=0;i<m;i++) {
77 int x=find(a[i]); int y=find(b[i]);
78 if(c[i][0]==‘>‘) {
79 add_edge(x,y); in[y]++;
80 }
81 else if (c[i][0]==‘<‘) {
82 add_edge(y,x); in[x]++;
83 }
84 }
85 int f=check(n);
86 if(!f) printf("OK\n");
87 else if(f==1) printf("UNCERTAIN\n");
88 else printf("CONFLICT\n");
89 }
90 }