原题链接:http://www.acmicpc.sdnu.edu.cn/problem/show/1031
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctype.h>
#include <deque>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int mod=998244353;
const ll inf=9999999999999;
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define mcy(a,b) memcpy(a,b,sizeof(a))
const int maxn=1e2+5;
struct node
{
int v;
int to;
}edge[maxn*2];
int n,m,a,b,tot,head[maxn],indegree[maxn],cpyindegree[maxn];
queue<int>ans;
void init()
{
tot=0;
mem(head,-1);
mem(indegree,0);
}
void add(int u,int v)
{
edge[++tot].v=v;
edge[tot].to=head[u];
head[u]=tot;
}
int topu(int number)
{
while(!ans.empty())ans.pop();
int sum=0,flag=0;
queue<int>q;
for(int i=0;i<number;++i)
{
cpyindegree[i]=indegree[i];
if(indegree[i]==0)q.push(i);
}
while(!q.empty())
{
if(q.size()>=2)flag=1;
int now=q.front();
q.pop();
sum++;
ans.push(now);
for(int i=head[now];~i;i=edge[i].to)
{
int v=edge[i].v;
cpyindegree[v]--;
if(cpyindegree[v]==0)q.push(v);
}
}
if(sum<number)return -1;
if(flag)return 0;
return 1;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
init();
string s;
if(n==0 && m==0)break;
int error=-1,success=-1;
for(int i=1;i<=m;++i)
{
cin >> s;
if(error!=-1 || success!=-1)continue;
a=s[0]-'A';
b=s[2]-'A';
if(s[1]=='<')
{
add(a,b);
indegree[b]++;
}
else
{
add(b,a);
indegree[a]++;
}
int flag=topu(n);
if(flag==-1)error=i;
if(flag==1)success=i;
}
if(error!=-1)
{
printf("Inconsistency found after %d relations.\n",error);
}
else if(success==-1)
printf("Sorted sequence cannot be determined.\n");
else
{
printf("Sorted sequence determined after %d relations: ",success);
while(!ans.empty())
{
int answer=ans.front();
ans.pop();
char c=answer+'A';
cout << c;
}
cout << ".\n";
}
}
return 0;
}