#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > G, rG;
vector<int> f, d1, d2;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  f.assign(n, 0);
  for (int i = (0); i <= ((n)-1); i++) scanf("%d", &f[i]);
  G.assign(n, vector<int>());
  rG.assign(n, vector<int>());
  for (int i = (0); i <= ((m)-1); i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    G[a].push_back(b);
    rG[b].push_back(a);
  }
  vector<int> res(n);
  d1.assign(n, 0);
  d2.assign(n, 0);
  queue<int> Q;
  for (int u = (0); u <= ((n)-1); u++)
    if (f[u] == 2) {
      Q.push(u);
      d2[u] = 1;
    }
  while (!Q.empty()) {
    int cur = Q.front();
    Q.pop();
    if (f[cur] != 1)
      for (int i = (0); i <= (((int)((rG[cur]).size())) - 1); i++)
        if (!d2[rG[cur][i]]) {
          d2[rG[cur][i]] = 1;
          Q.push(rG[cur][i]);
        }
  }
  for (int u = (0); u <= ((n)-1); u++)
    if (f[u] == 1) {
      Q.push(u);
      d1[u] = 1;
    }
  while (!Q.empty()) {
    int cur = Q.front();
    Q.pop();
    for (int i = (0); i <= (((int)((G[cur]).size())) - 1); i++)
      if (!d1[G[cur][i]]) {
        d1[G[cur][i]] = 1;
        Q.push(G[cur][i]);
      }
  }
  for (int i = (0); i <= ((n)-1); i++) res[i] = d1[i] & d2[i];
  for (int i = (0); i <= ((n)-1); i++) {
    printf("%d\n", res[i]);
  }
  return 0;
}
