#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <map> #include <set> #include <queue> #include <vector> #include <cmath> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=11000; struct Edge{ int v,w,nex; }edge[MAXN]; int tot,u,v,w; int head[MAXN]; int dist[MAXN]; int n,m; bool ans; char ch; vector<int> G[MAXN]; int up[MAXN],down[MAXN]; void addedge(int u,int v,int w) { edge[tot].v=v; edge[tot].w=w; edge[tot].nex=head[u]; head[u]=tot++; } void dfs(int u,int pre) { int sum=1; for(int i=0;i<G[u].size();i++) { if(G[u][i]==pre) continue; dfs(G[u][i],u); sum+=down[G[u][i]]; } if(down[u]) { if(up[u]!=-1) { if(sum>up[u]) ans=true; else down[u]=max(down[u],sum); } } else down[u]=sum; } int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF) { ans=false; for(int i=1;i<=n;i++) { down[i]=0; up[i]=-1; G[i].clear(); } for(int i=2;i<=n;i++) { scanf("%d",&u); G[u].push_back(i); } scanf("%d",&m); while(m--) { scanf("%d %c %d",&u,&ch,&w); if(ch=='=') up[u]=down[u]=w; if(ch=='<') up[u]=w-1; if(ch=='>') down[u]=w+1; } dfs(1,-1); for(int i=1;i<=n;i++) if(up[i]!=-1&&up[i]<down[i]) { ans=true; break; } printf("%s\n",ans?"Lie":"True"); } return 0; }