#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  int f, g, k;
  int deg[100000 + 5];
  int A[100000 + 5];
  vector<int> K[100000 + 5];
  memset(deg, 0, sizeof(deg));
  int l;
  for (int t = 0; t < n; t++) {
    scanf("%d", &l);
    A[t] = l;
  }
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &f, &g);
    K[g].push_back(f);
    deg[f]++;
  }
  queue<int> T;
  int found = 0;
  queue<int> PP;
  for (int i = 0; i < n; i++) {
    if (deg[i] == 0) {
      if (A[i] == 0) {
        T.push(i);
      } else {
        PP.push(i);
      }
    }
  }
  int nums = 0;
  for (;;) {
    while (!T.empty()) {
      int g = T.front();
      T.pop();
      for (int l = 0; l < K[g].size(); l++) {
        int k = K[g][l];
        deg[k]--;
        if (deg[k] == 0) {
          if (A[k] == 0) {
            T.push(k);
          } else {
            PP.push(k);
          }
        }
      }
    }
    if (PP.empty()) break;
    nums++;
    queue<int> PPP;
    while (!PP.empty()) {
      int g = PP.front();
      PP.pop();
      for (int l = 0; l < K[g].size(); l++) {
        int k = K[g][l];
        deg[k]--;
        if (deg[k] == 0) {
          if (A[k] == 0) {
            T.push(k);
          } else {
            PP.push(k);
          }
        }
      }
    }
  }
  cout << nums << endl;
  return 0;
}
