#include <stdio.h>
#define PAY(x) ((x).ust)
#define PAYDA(x) ((x).alt)
#define ABS_VAL(x) ((x)<0?(-x):(x))

typedef struct fraction{
int ust,alt;
} kesir;

kesir Org_mat[20][20];
int N,Multiplier=1,sira_index;
char kutu;
int atom_sira[20];

int Sayi_Oku(void)
{
int sonuc=0;
 while(kutu>=48 && kutu<=57)
 {
  sonuc=sonuc*10+kutu-48;
  kutu=getchar();
 }
if(!sonuc)
  return(1);
 else
  return(sonuc);
}

int Atom_Oku(void)
{
 int sonuc=0;
 sonuc=kutu-65;
 kutu=getchar();
 if(kutu>=97 && kutu<=122)
 {
 sonuc=sonuc*26 +kutu-97;
 kutu=getchar();
 }
 return(sonuc);
}

int Yer_Bul(int atom)
{
 register int i;
 for(i=0;i<sira_index;i++)
  if(atom==atom_sira[i])
  return(i);
  atom_sira[sira_index]=atom;
  return(sira_index++);
}

void Parse_Molecule(void)
{
 int atoms[400],quantity[400],parant[85];
 int atom_yer=0,parant_yer=0;
 int temp,i;
 while(kutu!='+' && kutu!='-' && kutu!=' ' && kutu!='\n' && kutu!=EOF)
 {
  switch(kutu){
  case '(': parant[parant_yer++]=atom_yer;
            kutu=getchar();
            break;
  case ')': kutu=getchar();
            temp=Sayi_Oku();
            for(i=parant[--parant_yer];i<atom_yer;i++)
            quantity[i]*=temp;
            break;
  default : atoms[atom_yer]=Atom_Oku();
            quantity[atom_yer++]=Sayi_Oku();
            break;
  }
 }
if(Multiplier<0)
for(i=0;i<atom_yer;i++)
 quantity[i]*=-1;

for(i=0;i<atom_yer;i++)
 PAY(Org_mat[Yer_Bul(atoms[i])][N])+=quantity[i];
for(i=0;i<20;i++)
 PAYDA(Org_mat[i][N])=1;
N++;
}

void Read_and_Parse(void)
{
 register int i;
 kutu=getchar();
 while(kutu!='\n' && kutu!=EOF)
 {
  switch(kutu){
  case '-': kutu=getchar();
            Multiplier=-1;
  case '+':
  case ' ': kutu=getchar();
            break;
  default : Parse_Molecule();
            break;
  }
 }

N--;
for(i=0;i<sira_index;i++)
 PAY(Org_mat[i][N])*=-1;
}

void Change_Row_2(int row1,int row2)
{
 kesir temp;
 register int i;
 for(i=0;i<=N;i++)
  {
   temp=Org_mat[row1][i];
   Org_mat[row1][i]=Org_mat[row2][i];
   Org_mat[row2][i]=temp;
  }
}

void Change_Row(int row)
{
 register int i;
 for(i=row+1;i<N;i++)
  if((float)PAY(Org_mat[i][row])/PAYDA(Org_mat[i][row])==1.)
  break;
 if(i==N)
  for(i=row+1;i<N;i++)
   if((float)PAY(Org_mat[i][row])/PAYDA(Org_mat[i][row])!=.0)
   break;
 Change_Row_2(row,i);
}

int Obeb(int num1,int num2)
{
 int temp;
 num1=ABS_VAL(num1);
 if(num2>num1)
  {
   temp=num2;
   num2=num1;
   num1=temp;
  }
  if(!num2)
   return(num1);
  
 temp=num1%num2;
 while(temp!=0)
 {
  num1=num2;
  num2=temp;
  temp=num1%num2;
 }
 return(num2);
}

kesir Carp(kesir frac1,kesir frac2)
{
 kesir temp;
 int sad1,sad2;
 sad1=Obeb(PAY(frac1),PAYDA(frac2));
 sad2=Obeb(PAY(frac2),PAYDA(frac1));
 PAY(temp)=(PAY(frac1)/sad1)*(PAY(frac2)/sad2);
 PAYDA(temp)=(PAYDA(frac1)/sad2)*(PAYDA(frac2)/sad1);
 return(temp);
}

void Make_One(int row)
{
 register int i;
 kesir temp;
 PAY(temp)=PAYDA(Org_mat[row][row]);
 PAYDA(temp)=PAY(Org_mat[row][row]);
 if(PAYDA(temp)<0)
 {
  PAY(temp)*=-1;
  PAYDA(temp)*=-1;
 }
 PAY(Org_mat[row][row])=PAYDA(Org_mat[row][row])=1;
 for(i=row+1;i<=N;i++)
 Org_mat[row][i]=Carp(Org_mat[row][i],temp);
}

kesir Topla(kesir frac1,kesir frac2)
{
 kesir temp;
 int sad;
 PAY(temp)=PAY(frac1)*PAYDA(frac2)+PAY(frac2)*PAYDA(frac1);
 PAYDA(temp)=PAYDA(frac1)*PAYDA(frac2);

 sad=Obeb(PAY(temp),PAYDA(temp));
 PAY(temp)/=sad;
 PAYDA(temp)/=sad;
 return(temp);
}

void Make_Below_Zero(int row)
{
 register int i,j;
 kesir temp;
 for(i=row+1;i<N;i++)
  if(PAY(Org_mat[i][row])!=0)
  {
   PAY(temp)=-PAY(Org_mat[i][row]);
   PAYDA(temp)=PAYDA(Org_mat[i][row]);
   PAY(Org_mat[i][row])=0;
   PAYDA(Org_mat[i][row])=1;
   for(j=row+1;j<=N;j++)
    Org_mat[i][j]=Topla(Org_mat[i][j],Carp(Org_mat[row][j],temp));
  }
}

void Asagi_In(void)
{
register int i;
 for(i=0;i<N;i++)
  switch(PAY(Org_mat[i][i]))
  {
   case  0 : Change_Row(i);
   default : Make_One(i);
   case 1  : if(PAYDA(Org_mat[i][i])!=1)
              Make_One(i);
             Make_Below_Zero(i);
             break;
  }
}

void Yukari_Cik()
{
register int i,j,k;
kesir temp;
for(i=1;i<N;i++)
 {
  for(j=0;j<i;j++)
   if(PAY(Org_mat[j][i]))
   {
   PAY(temp)=-PAY(Org_mat[j][i]);
   PAYDA(temp)=PAYDA(Org_mat[j][i]);
   PAY(Org_mat[j][i])=0;
   PAYDA(Org_mat[j][i])=1;
   for(k=i+1;k<=N;k++)
    Org_mat[j][k]=Topla(Org_mat[j][k],Carp(Org_mat[i][k],temp));
   }
 }
}

void Solve_Matrix(void)
{
Asagi_In();
Yukari_Cik();
}

void Sadelestir(void)
{
 register int i,j,sad;
 kesir temp;
 PAY(Org_mat[N][N])=PAYDA(Org_mat[N][N])=1;
 for(i=0;i<N;i++)
  if(PAYDA(Org_mat[i][N])!=1)
  {
   temp=Org_mat[i][N];
   for(j=0;j<=N;j++)
   {
    sad=Obeb(PAYDA(temp),PAYDA(Org_mat[j][N]));
    PAY(Org_mat[j][N])*=PAYDA(temp)/sad;
    PAYDA(Org_mat[j][N])/=sad;
   }
  }
}

void Print_Result(void)
{
 register int i;
 for(i=0;i<N;i++)
  printf("%d ",PAY(Org_mat[i][N]));
  printf("%d",PAY(Org_mat[N][N]));
}

int main(void)
{
Read_and_Parse();
Solve_Matrix();
Sadelestir();
Print_Result();
return(0);
}
