#include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; int n,m,pi[26],vis[26]; struct node { vector<int> adj[26]; int indeg[26]; }p; void add(node &N,int u,int v) { N.adj[u].push_back(v); N.indeg[v]++; } int toposort(node N) { int count=0,i,k=0,vn=0,bj=0; queue<int> q; for(i=0;i<n;i++) { if(vis[i]) { vn++; if(!N.indeg[i]) q.push(i); } } while(!q.empty()) { count++; int x=q.front(); q.pop(); pi[k++]=x; if(!q.empty()) bj=1; for(vector<int>::iterator it=N.adj[x].begin();it!=N.adj[x].end();it++) if(!(--N.indeg[*it])) q.push(*it); } if(vn==n) { if(count==n) { if(bj) return -1; else return 1; } else return 0; } else { if(count==vn) return -1; else return 0; } } int main() { int i,u,v,flag; char s[4]; while(scanf("%d%d",&n,&m)!=EOF,n||m) { flag=0; for(i=0;i<26;i++) { p.adj[i].clear(); p.indeg[i]=0; } memset(vis,0,sizeof(vis)); for(i=0;i<m;i++) { scanf("%s",s); u=s[0]-'A'; v=s[2]-'A'; vis[u]=vis[v]=1; add(p,u,v); if(!flag) { int t=toposort(p); if(t==0) { printf("Inconsistency found after %d relations.\n",i+1); flag=1; } else if(t==-1&&i==m-1) printf("Sorted sequence cannot be determined.\n"); else if(t==1) { printf("Sorted sequence determined after %d relations: ",i+1); for(int j=0;j<n;j++) printf(j==n-1?"%c.\n":"%c",pi[j]+'A'); flag=1; } } } } return 0; } /************************************************************** Problem: 2133 User: admin Language: C++ Result: Accepted Time:8 ms Memory:1264 kb ****************************************************************/