#include <bits/stdc++.h>
using namespace std;
typedef struct widget_ {
  char type;
  long long int w, h;
  long long int border, spacing;
  vector<string> filhos;
  bool calculated;
} widget;
map<string, widget> m;
vector<string> all;
char line[1024];
char buf[1024];
char name[1024], name2[1024];
int n, p;
long long int w, h;
void calculate(string name) {
  widget n = m[name];
  if (n.calculated) return;
  if (n.type == 'w') return;
  m.erase(name);
  for (int i = 0; i < (int)n.filhos.size(); i++) calculate(n.filhos[i]);
  if (n.type == 'h') {
    long long int w = 0;
    long long int h = 0;
    for (int i = 0; i < (int)n.filhos.size(); i++) {
      w += m[n.filhos[i]].w;
      h = max(h, m[n.filhos[i]].h);
    }
    w += 2 * n.border + ((int)n.filhos.size() - 1) * n.spacing;
    h += 2 * n.border;
    n.w = w;
    n.h = h;
  } else {
    long long int w = 0;
    long long int h = 0;
    for (int i = 0; i < (int)n.filhos.size(); i++) {
      h += m[n.filhos[i]].h;
      w = max(w, m[n.filhos[i]].w);
    }
    h += 2 * n.border + ((int)n.filhos.size() - 1) * n.spacing;
    w += 2 * n.border;
    n.w = w;
    n.h = h;
  }
  if ((int)n.filhos.size() == 0) {
    n.w = 0;
    n.h = 0;
  }
  n.calculated = true;
  m[name] = n;
}
int main() {
  m.clear();
  all.clear();
  scanf("%d", &n);
  for (int c = 0; c < n; c++) {
    scanf(" %[^\n]", line);
    if (sscanf(line, "Widget %s", buf) == 1) {
      for (p = 0; p < (int)strlen(buf); p++)
        if (buf[p] == '(') break;
      sscanf(buf + p, "(%I64d,%I64d)", &w, &h);
      buf[p] = '\0';
      strcpy(name, buf);
      widget n;
      n.type = 'w';
      n.border = n.spacing = 0;
      n.filhos.clear();
      n.w = w;
      n.h = h;
      n.calculated = false;
      string names = name;
      m[names] = n;
    } else if (sscanf(line, "VBox %s", name) == 1) {
      widget n;
      n.type = 'v';
      n.border = n.spacing = n.w = n.h = 0;
      n.filhos.clear();
      n.calculated = false;
      string names = name;
      m[names] = n;
      all.push_back(names);
    } else if (sscanf(line, "HBox %s", name) == 1) {
      widget n;
      n.type = 'h';
      n.border = n.spacing = n.w = n.h = 0;
      n.filhos.clear();
      n.calculated = false;
      string names = name;
      m[names] = n;
      all.push_back(names);
    } else {
      for (p = 0; p < (int)strlen(line); p++)
        if (line[p] == '.') break;
      int pname = p;
      for (; p < (int)strlen(line); p++)
        if (line[p] == '(') break;
      line[pname] = '\0';
      strcpy(name, line);
      string names = name;
      if (sscanf(line + p, "(%I64d)", &w) == 1) {
        line[p] = '\0';
        if (strcmp(line + pname + 1, (char*)"set_border") == 0) {
          widget n = m[names];
          m.erase(names);
          n.border = w;
          m[names] = n;
        } else if (strcmp(line + pname + 1, (char*)"set_spacing") == 0) {
          widget n = m[names];
          m.erase(names);
          n.spacing = w;
          m[names] = n;
        }
      } else if (sscanf(line + p, "(%s", name2) == 1) {
        name2[(int)strlen(name2) - 1] = '\0';
        string names2 = name2;
        widget father = m[names];
        m.erase(names);
        father.filhos.push_back(names2);
        m[names] = father;
      }
    }
  }
  for (int i = 0; i < (int)all.size(); i++) calculate(all[i]);
  for (map<string, widget>::iterator i = m.begin(); i != m.end(); i++) {
    string names = i->first;
    widget n = i->second;
    printf("%s %I64d %I64d\n", names.c_str(), n.w, n.h);
  }
  return 0;
}
