#include <bits/stdc++.h>
using namespace std;
template <class T, class U>
inline void relax_min(T &a, U b) {
  a = min(a, b);
}
template <class T, class U>
inline void relax_max(T &a, U b) {
  a = max(a, b);
}
template <typename T>
inline bool updmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline bool updmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T, class U>
istream &operator>>(istream &in, pair<T, U> &a) {
  in >> a.first >> a.second;
  return in;
}
template <class T, class U>
ostream &operator<<(ostream &out, const pair<T, U> &a) {
  out << a.first << ' ' << a.second;
  return out;
}
template <class T>
istream &operator>>(istream &in, vector<T> &a) {
  for (decltype(0)((i)) = (0); ((i)) < ((((int)(a).size()))); ++((i)))
    in >> a[i];
  return in;
}
template <class T>
ostream &operator<<(ostream &out, const vector<T> &a) {
  for (decltype(0)((i)) = (0); ((i)) < ((((int)(a).size()))); ++((i)))
    out << a[i] << ' ';
  return out;
}
int next_int() {
  int(tmp);
  scanf("%d", &(tmp));
  return tmp;
}
long long next_ll() {
  long long(tmp);
  scanf("%lld", &(tmp));
  return tmp;
}
long long modPow(long long a, long long b, long long MOD) {
  long long ret = 1;
  for (; b; b >>= 1) {
    if (b & 1)
      ret = ((((((long long)(ret) * (long long)(a))) % ((MOD))) + ((MOD))) %
             ((MOD)));
    a = ((((((long long)(a) * (long long)(a))) % ((MOD))) + ((MOD))) % ((MOD)));
  }
  return ret;
}
const long long EXACTLY_ONE_HUNDRED = 100;
const long long EXACTLY_ONE_THOUSAND = 1000;
const long long EXACTLY_ONE_MILLION = 1000 * 1000;
const long long EXACTLY_ONE_BILLION =
    EXACTLY_ONE_THOUSAND * EXACTLY_ONE_MILLION;
const int MAXN1 = (int)(EXACTLY_ONE_HUNDRED * EXACTLY_ONE_THOUSAND) + 3;
const int MAXN2 = (int)(2 * EXACTLY_ONE_HUNDRED * EXACTLY_ONE_THOUSAND) + 3;
const int MAXN3 = (int)(3 * EXACTLY_ONE_HUNDRED * EXACTLY_ONE_THOUSAND) + 3;
const int MAXN4 = (int)(4 * EXACTLY_ONE_HUNDRED * EXACTLY_ONE_THOUSAND) + 3;
const int MAXN5 = (int)(5 * EXACTLY_ONE_HUNDRED * EXACTLY_ONE_THOUSAND) + 3;
const int MAXN = MAXN3;
const int INF = (int)EXACTLY_ONE_BILLION + 7;
const int INF2 = 1 << 30;
const long long INFLL = 4LL * EXACTLY_ONE_BILLION * EXACTLY_ONE_BILLION + 7;
const long long INFLL2 = 1LL << 60;
const long double Pi = acos(-1.0);
const long double EPS = 1e-7;
const int MOD = (int)EXACTLY_ONE_BILLION + 7;
enum {
  OR = 1,
  XOR = 2,
  AND = 3,
  NO = -1,
};
struct form {
  int left, right;
  int op;
  string val;
  form(int a, int op1, int b, string &qw)
      : left(a), right(b), op(op1), val(qw) {}
  form() {}
};
int func(int a, int op, int b) {
  if (op == XOR) return a ^ b;
  if (op == OR) return a | b;
  if (op == AND) return a & b;
  return a;
}
char buf[MAXN3];
string names[MAXN3];
int main() {
  unordered_map<string, form> formula;
  unordered_map<string, int> OP;
  unordered_map<string, int> OPER;
  OP["AND"] = AND;
  OP["OR"] = OR;
  OP["XOR"] = XOR;
  int(n), (m);
  scanf("%d%d", &((n)), &((m)));
  string EMPTY_STRING = "";
  string s;
  fgets(buf, 10000, stdin);
  OPER["?"] = n;
  for (decltype(0)((i)) = (0); ((i)) < ((n)); ++((i))) {
    fgets(buf, 10000, stdin);
    s = buf;
    if (s.back() == '\n') s.pop_back();
    stringstream str(s);
    string name, emp;
    str >> name >> emp;
    OPER[name] = i;
    if (s.find("OR") != string::npos || s.find("AND") != string::npos) {
      string left, op, right;
      str >> left >> op >> right;
      if (right == "?") swap(left, right);
      formula[name] = form(OPER[left], OP[op], OPER[right], EMPTY_STRING);
    } else {
      string val;
      str >> val;
      formula[name] = form(0, NO, 0, val);
    }
    names[i] = name;
  }
  string mina(m, '0'), maxa(m, '0');
  int value[10000];
  for (decltype(0)((i)) = (0); ((i)) < ((m)); ++((i))) {
    int cnt[2] = {0};
    for (decltype(0)((bit)) = (0); ((bit)) < ((2)); ++((bit))) {
      value[n] = bit;
      for (decltype(0)((j)) = (0); ((j)) < ((n)); ++((j))) {
        auto cur = formula[names[j]];
        if (cur.op == NO) {
          value[j] = cur.val[i] - '0';
        } else {
          value[j] = func(value[cur.left], cur.op, value[cur.right]);
        }
        cnt[bit] += value[j];
      }
    }
    mina[i] = '0';
    maxa[i] = '1';
    if (cnt[0] == cnt[1]) maxa[i] = '0';
    if (cnt[0] > cnt[1]) swap(mina[i], maxa[i]);
  }
  printf("%s\n", mina.c_str());
  printf("%s\n", maxa.c_str());
  return 0;
}
