拓扑排序:
// ShellDawn
// POJ1094
// No.3
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define MM(x) memset(x,0,sizeof(x));
using namespace std;
#define maxn 30
int n,m;
int E[maxn][maxn];
int V[maxn];
int v[maxn];
queue<int> ans;
int solve(){
memcpy(v,V,sizeof(V));
while(!ans.empty()) ans.pop();
int cnt = 0;
bool flag = true;
int s = n;
queue<int> q;
while(s>0){
//printf("<%d>\n",s);
//for(int i=0;i<n;i++) printf("%d%s",v[i],i==n-1?"\n":" ");
cnt = 0;
for(int i=0;i<n;i++){
if(v[i] == 0){
s--;
ans.push(i);
q.push(i);
v[i] = -1;
cnt++;
}
}
if(cnt == 0){
return -1; // 环
}
if(cnt > 1){
flag = false; // 不确定
}
while(!q.empty()){
int loc = q.front();
q.pop();
for(int i=0;i<n;i++){
if(E[loc][i] == 1){
v[i] -- ;
}
}
}
}
if(flag) return 1; // 有序
return 0; // 不确定
}
int main(){
while(scanf("%d%d",&n,&m)&&n!=0){
MM(E);
MM(V);
bool flag = false;
for(int i=0;i<m;i++){
string s;
cin>>s;
if(flag) continue;
int a = s[0] - 'A';
int b = s[2] - 'A';
if(E[a][b] == 0){
E[a][b] = 1;
V[b]++;
}
int S = solve();
if(S == 1){ // 有序
flag = true;
printf("Sorted sequence determined after %d relations: ",i+1);
while(!ans.empty()){
printf("%c",ans.front()+'A');
ans.pop();
}
puts(".");
continue;
}
if(S == -1){ // 环
flag = true;
printf("Inconsistency found after %d relations.\n",i+1);
continue;
}
}
if(!flag){
puts("Sorted sequence cannot be determined.");
}
}
return 0;
}