#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do {
    x = x * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  return x * f;
}
const int N = 100010, M = 100010;
const int INF = 0x3f3f3f3f;
int data[N];
struct G {
  struct node {
    int u, v, next;
  } edge[M << 1];
  int last[N], le;
  void add(int u, int v) {
    edge[++le].u = u, edge[le].v = v, edge[le].next = last[u], last[u] = le;
  }
  void cl() {
    memset(last, 0, sizeof(last));
    le = 0;
  }
} G1, G2;
int pre[N], low[N], scc_cnt, lt, scc_node[N], sccsz[N], in[N];
stack<int> s;
void dfs(int u) {
  pre[u] = low[u] = ++lt;
  s.push(u);
  for (int i = G1.last[u]; i; i = G1.edge[i].next) {
    int v = G1.edge[i].v;
    if (!pre[v]) {
      dfs(v);
    }
    if (!scc_node[v]) low[u] = min(low[u], low[v]);
  }
  if (pre[u] == low[u]) {
    ++scc_cnt;
    while (!s.empty()) {
      int x = s.top();
      s.pop();
      scc_node[x] = scc_cnt;
      ++sccsz[scc_cnt];
      if (u == x) break;
    }
  }
}
void init() {
  memset(pre, 0, sizeof(pre));
  memset(low, 0, sizeof(low));
  memset(scc_node, 0, sizeof(scc_node));
  memset(sccsz, 0, sizeof(sccsz));
  memset(in, 0, sizeof(in));
  scc_cnt = lt = 0;
}
int dp[N], vis[N];
int dfs2(int u) {
  if (dp[u]) return dp[u];
  dp[u] = sccsz[u];
  for (int i = G2.last[u]; i; i = G2.edge[i].next) {
    int v = G2.edge[i].v;
    dp[u] += dfs2(v);
  }
  return dp[u];
}
int tans[N], la;
void dfs3(int u) {
  tans[++la] = u;
  vis[u] = 1;
  for (int i = G1.last[u]; i; i = G1.edge[i].next) {
    int v = G1.edge[i].v;
    if (!vis[v]) dfs3(v);
  }
}
int vis2[N];
bool dfs4(int u) {
  vis[u] = vis2[u] = 1;
  for (int i = G2.last[u]; i; i = G2.edge[i].next) {
    int v = G2.edge[i].v;
    if (vis[v]) return 1;
    if (dfs4(v)) return 1;
  }
  vis[u] = 0;
  return 0;
}
int main() {
  init();
  G1.cl(), G2.cl();
  int n = read(), m = read(), h = read();
  for (int i = 1; i <= n; ++i) data[i] = read();
  for (int i = 1; i <= m; ++i) {
    int u = read(), v = read();
    if (data[u] + 1 == data[v] || data[u] + 1 == data[v] + h) G1.add(u, v);
    if (data[v] + 1 == data[u] || data[v] + 1 == data[u] + h) G1.add(v, u);
  }
  for (int i = 1; i <= n; ++i)
    if (!pre[i]) dfs(i);
  for (int i = 1; i <= G1.le; ++i) {
    int u = G1.edge[i].u, v = G1.edge[i].v;
    if (scc_node[u] != scc_node[v])
      ++in[scc_node[v]], G2.add(scc_node[u], scc_node[v]);
  }
  for (int i = 1; i <= scc_cnt; ++i)
    if (!in[i]) dfs2(i);
  int ans = INF;
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; ++i)
    if (dp[scc_node[i]] > 0) {
      int num = dp[scc_node[i]];
      if (num < ans) ans = num;
    }
  memset(vis, 0, sizeof(vis));
  la = 0;
  for (int i = 1; i <= n; ++i)
    if (dp[scc_node[i]] > 0) {
      int num = dp[scc_node[i]];
      if (num == ans) {
        dfs3(i);
        break;
      }
    }
  if (ans < 0) {
    printf("%d\n", scc_cnt);
    printf("%d %d\n", ans, la);
    printf("%d %d\n", G1.le, G2.le);
    for (int i = 1; i <= scc_cnt; ++i) printf("%d ", sccsz[i]);
    memset(vis, 0, sizeof(vis));
    bool gfg = 0;
    for (int i = 1; i <= scc_cnt; ++i)
      if (!vis2[i]) {
        if (dfs4(i)) {
          gfg = 1;
          break;
        }
      }
    printf("\n%d\n", gfg);
  }
  printf("%d\n", ans);
  for (int i = 1; i <= la; ++i) printf("%d ", tans[i]);
  return 0;
}
