#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const long long ooo = 9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 1000 * 1000 * 1000 + 7;
const int N = 200005;
const double PI = acos(-1.0);
const double eps = 1e-9;
int o(int x) { return x % _p; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void file_put() {
  freopen("filename.in", "r", stdin);
  freopen("filename.out", "w", stdout);
}
int n, m, h, a[N], d[N], x, y, z, ans = oo;
vector<int> V[N], ret;
const int _N = 1e6 + 5, _M = 1e6 + 5;
struct Tu {
  int head[_N], nxt[_M], e[_M], n, tot;
  long long v[_N], w[_M];
  void Init(int _n) { n = _n, memset(head, 0, sizeof(head)), tot = 0; }
  void I(int x, int y, long long _w) {
    e[++tot] = y, w[tot] = _w;
    nxt[tot] = head[x], head[x] = tot;
  }
};
struct Tarjan {
  int id[_N], dfn[_N], low[_N], s[_N], n, r, t, tot;
  bool in[_N];
  void dfs(Tu &A, int x) {
    dfn[x] = low[x] = ++t, in[x] = 1, s[++r] = x;
    for (int i = A.head[x], y; i; i = A.nxt[i])
      if (!dfn[y = A.e[i]])
        dfs(A, y), low[x] = ((low[x]) < (low[y]) ? (low[x]) : (low[y]));
      else if (in[y])
        low[x] = ((low[x]) < (dfn[y]) ? (low[x]) : (dfn[y]));
    if (low[x] == dfn[x]) {
      ++tot;
      while (r && s[r + 1] != x) id[s[r]] = tot, in[s[r--]] = 0;
    }
  }
  void solve(Tu &A, Tu &B) {
    n = A.n;
    memset(dfn, 0, sizeof(dfn));
    memset(low, 0, sizeof(low));
    memset(in, 0, sizeof(in));
    r = tot = t = 0;
    for (int x = (1); x <= (n); ++x)
      if (!dfn[x]) dfs(A, x);
    B.Init(tot);
    memset(B.v, 0, sizeof(B.v));
    for (int x = (1); x <= (n); ++x)
      for (int i = A.head[x]; i; i = A.nxt[i])
        if (id[x] == id[A.e[i]])
          B.v[id[x]] += A.w[i];
        else
          B.I(id[x], id[A.e[i]], A.w[i]), d[id[x]]++;
    for (int x = (1); x <= (n); ++x) V[id[x]].push_back(x);
  }
};
Tu A, B;
Tarjan T;
int main() {
  scanf("%d%d%d", &n, &m, &h), A.Init(n);
  for (int i = (1); i <= (n); ++i) scanf("%d", &a[i]);
  for (int i = (1); i <= (m); ++i) {
    scanf("%d%d", &x, &y);
    if ((a[x] + 1) % h == a[y]) A.I(x, y, 0);
    if ((a[y] + 1) % h == a[x]) A.I(y, x, 0);
  }
  T.solve(A, B);
  for (int i = (1); i <= (B.n); ++i)
    if (!d[i] && V[i].size() < ans) ans = V[i].size(), ret.swap(V[i]);
  printf("%d\n", ans);
  for (__typeof((ret).begin()) it = (ret).begin(); it != (ret).end(); it++)
    printf("%d ", *it);
  printf("\n");
  return 0;
}
