import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.lang.Math;
class point {
String name;
int time;
int color=0; //1-cиний 2-красный
int IsBlue=0;
int mark=0;
int cap;
ArrayList<point> list = new ArrayList<point>();
}
public class Factorial {
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);
int i=0,j=0,size=0,k=0,len,l=0;
char[]bufff = new char[20];
String buff=new String();
String buff1=new String();
buff1="";
int buf;
ArrayList<String>forms = new ArrayList<String>();
forms.add(i, sc.nextLine());
while(forms.get(i).charAt(forms.get(i).length() - 1) == ';' || forms.get(i).charAt(forms.get(i).length() - 1) == '<') {
while (forms.get(i).charAt(forms.get(i).length() - 1) == '<'){
forms.set(i,forms.get(i)+sc.nextLine());
}
if (forms.get(i).charAt(forms.get(i).length() - 1) == ';'){
i++;
forms.add(i, sc.nextLine());
}
}
len=forms.size();
ArrayList<String>names=new ArrayList<String>();
ArrayList<Integer>times=new ArrayList<Integer>();
OUTERMOST: for(i=0;i<len;i++){ //проходим по всем формулам
for(j=0;j<forms.get(i).length();j++) {
bufff[k]=forms.get(i).charAt(j);
while(forms.get(i).charAt(j)!=' ' && forms.get(i).charAt(j)!='(' && forms.get(i).charAt(j)!='<' && forms.get(i).charAt(j)!=';'){ //проходим по названию работы
try{
bufff[++k]=forms.get(i).charAt(++j);
}
catch(Exception e){
break OUTERMOST;
}
}
bufff[k]='\0';
if(forms.get(i).charAt(j) == '('){ //если упоминалось впервые-сохраняем работу и считываем время.
size++;
for(l=0;l<k;l++)
buff+=bufff[l];
names.add(buff);
k=0;
j++;
buff="";
bufff[k]=forms.get(i).charAt(j);
while(forms.get(i).charAt(j+1)!=')')
bufff[++k]=forms.get(i).charAt(++j);
for(l=0;l<=k;l++)
buff+=bufff[l];
buf=Integer.valueOf(buff);
times.add(buf);
k=0;
buff="";
j++;
}
else{
k=0;
}
}
}
//for(i=0;i<names.size();i++){
// System.out.println(names.get(i) +" "+times.get(i));
//}
point [] graph=new point[size];
for (i=0;i<size;i++) { //создали граф с именами и временем
graph[i]=new point();
graph[i].name=new String();
graph[i].name=names.get(i);
graph[i].time=times.get(i);
}
OUTERMOST:for(i=0;i<len;i++){//снова проходим по формулам,чтобы выявить все дуги графа.
buff1="";
buff="";
for(j=0,k=0;j<forms.get(i).length();j++,k=0) {
bufff[k]=forms.get(i).charAt(j);
while(forms.get(i).charAt(j)!=' ' && forms.get(i).charAt(j)!='(' && forms.get(i).charAt(j)!=')' && forms.get(i).charAt(j)!='<' && forms.get(i).charAt(j)!=';' && !Character.isDigit(forms.get(i).charAt(j))){ //проходим по названию работы
try{
while(forms.get(i).charAt(j)!=' ' && forms.get(i).charAt(j)!='(' && forms.get(i).charAt(j)!=')' && forms.get(i).charAt(j)!='<' && forms.get(i).charAt(j)!=';')
bufff[++k]=forms.get(i).charAt(++j);
}
catch(Exception e){//повтор кода при вылете!!!!!
if(k!=0){
buff="";
for(l=0;l<k;l++)
buff+=bufff[l];
if(buff1==""){
buff1=buff;
continue;
}
else{
graph[names.indexOf(buff1)].list.add(graph[names.indexOf(buff)]);//заполняем наш граф дугами.
graph[names.indexOf(buff1)].cap++;
buff1=buff;
}
}
break OUTERMOST;
}
}
if(k!=0){
buff="";
for(l=0;l<k;l++)
buff+=bufff[l];
if(buff1==""){
buff1=buff;
continue;
}
else{
graph[names.indexOf(buff1)].list.add(graph[names.indexOf(buff)]);//заполняем наш граф дугами.
graph[names.indexOf(buff1)].cap++;
buff1=buff;
}
}
}
}
//for (i=0;i<size;i++) {
// System.out.println(names.get(i) + " " + times.get(i));
// for (j = 0; j < graph[i].list.size(); j++) {
// System.out.println(" "+graph[i].list.get(j).name);
// }
//}
for(i=0;i<size;i++) {
dfs1(graph, graph[i]);
for(j=0;j<size;j++)
graph[j].mark=0;
}
for(i=0;i<size;i++)
{
graph[i].mark=0;
}
/*for(i=0;i<size;i++){
if(graph[i].IsBlue==1)
{
System.out.println(names.get(i) + " " + names.indexOf(names.get(i)));
}
}*/
for(i=0;i<size;i++){
if(graph[i].IsBlue==1){
dfs2(graph,graph[i]);
}
}
/*
for(i=0;i<size;i++){
System.out.println(names.get(i)+" "+graph[i].IsBlue);
}*/
}
public static void dfs1(point [] graph,point Vertex){
int i, size;
point v=Vertex;
point u;
v.mark=1;
for (i = 0; i < Vertex.cap; i++) {
u = Vertex.list.get(i);
if(u.mark==0) {
dfs1(graph,u);
}
if(u.mark==1){
u.IsBlue=1;
}
//действия при проходе по ребру
}
v.mark=2;
}
public static void dfs2(point [] graph,point Vertex){
int i, size;
point v=Vertex;
point u;
v.IsBlue=1;
v.mark=1;
for (i = 0; i < Vertex.cap; i++) {
u = Vertex.list.get(i);
if(u.mark==0) {
dfs2(graph,u);
}
//действия при проходе по ребру
}
v.mark=2;
}
}