#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ppb pop_back
typedef vector<int> vi;
const int maxn = 1e4 + 7;
int n, m, tri, np[maxn], s1[maxn], s2[maxn];
bool vis[maxn], in[maxn][maxn];
char ans[maxn];
string c;
void dfs(int v){
if (v <= n){
np[tri] += 1 - in[tri][v];
in[tri][v] = 1;
return;
}
v -= n;
if (vis[v]) return;
vis[v] = 1;
dfs(s1[v]);
dfs(s2[v]);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m >> c;
c = "$" + c;
for (int i = 1; i <= n; i++)
ans[i] = '?';
for (int i = 1; i <= m; i++){
char c1, c2;
int u, v;
cin >> c1 >> u >> c2 >> v;
s1[i] = (c1 == 'c') * n + u;
s2[i] = (c2 == 'c') * n + v;
}
for (int i = 1; i <= m; i++){
for (int j = 1; j <= m; j++)
vis[j] = 0;
tri = i;
dfs(i + n);
}
for (int i = 1; i <= m; i++){
if (c[i] != '0') continue;
for (int j = 1; j <= n; j++){
if (!in[i][j] || ans[j] == '0')
continue;
ans[j] = '0';
for (int k = 1; k <= m; k++)
np[k] -= in[k][j];
}
}
for (int i = 1; i <= m; i++){
if (c[i] != '1' || np[i] != 1)
continue;
int neod = -1;
bool all0 = 1;
for (int j = 1; j <= n; j++){
if (!in[i][j]) continue;
if (ans[j] == '1'){
all0 = 0;
break;
}
if (ans[j] == '?')
neod = j;
}
if (!all0) continue;
ans[neod] = '1';
}
for (int i = 1; i <= m; i++){
if (c[i] != '?') continue;
bool im1 = 0, nmu = 1;
for (int j = 1; j <= n; j++){
if (!in[i][j]) continue;
im1 |= (ans[j] == '1');
nmu &= (ans[j] != '?');
}
if (im1) c[i] = '1';
else if (nmu) c[i] = '0';
}
for (int i = 1; i <= m; i++){
if (c[i] != '?') continue;
for (int j = 1; j <= m; j++){
if (c[j] != '1') continue;
bool b = 1;
for (int k = 1; k <= n; k++){
if (!in[j][k]) continue;
b &= (in[i][k] || ans[k] == '0');
}
if (b){
c[i] = '1';
break;
}
}
}
for (int i = 1; i <= m; i++)
cout << c[i];
cout << "\n";
return 0;
}