/*
http://acm.pku.edu.cn/JudgeOnline/problem?id=3295
求给定的表达式是否恒为真
K, A, N, C, E mean
and, or, not, implies,
and
equals
as defined in
the truth table below
and: x && y
or : x || y
not : !x
implies : (!x)||y
equals : x==y
两种方法
1.递归(从前往后)
2.栈模拟(从后往前)
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<functional>
using namespace std;
const int INF=(1<<31)-1;
const double EPS=1e-8;
int pos;
int Stack[200];
int Push(int x)
{
Stack[pos++]=x;
}
int Pop()
{
return Stack[--pos];
}
int main()
{
char str[200];
while(cin>>str)
{
if(str[0]=='0')break;
int v[5];
bool flag=true;
for(int i=0;i<32;i++)//状态压缩,代表p,q,r,s,t的状态
{
for(int j=0;j<5;j++)
{
v[j]=(i>>j)&1; // p q r s t
}
pos=0;
for(int len=strlen(str)-1;len>=0;len--)//从后向前,用栈模拟,到最后栈顶元素就是该表达式的值
{
if(str[len]>='p'&&str[len]<='t')
{
Push(v[str[len]-'p']);
}
else if(str[len]=='K')
{
int b=Pop();
int a=Pop();
Push(a&&b);
}
else if(str[len]=='A')
{
int b=Pop();
int a=Pop();
Push(a||b);
}
else if(str[len]=='N')
{
int b=Pop();
Push(!b);
}
else if(str[len]=='C')
{
int b=Pop();
int a=Pop();
Push((!a)||b);
}
else if(str[len]=='E')
{
int b=Pop();
int a=Pop();
Push(a==b);
}
}
if(!Stack[0]){flag=false;break;}
}
if(flag)printf("tautology/n");
else printf("not/n");
}
//system("pause");
return 0;
}