#include <bits/stdc++.h>
const int N = 505;
int n, m, K, trap, tr[N], d[N];
bool jud[N];
double G[N][N], rev[N][N], pr[N], con[N][N];
bool sgn(double x) { return fabs(x) > 1e-10; }
struct Matrix {
  Matrix() { memset(a, 0, sizeof(a)); }
  double a[105][105];
} trans, val;
void print(Matrix z) {
  for (int i = 1; i <= trap; ++i)
    for (int j = 1; j <= trap; ++j)
      printf("%.f%c", z.a[i][j], j == trap ? '\n' : ' ');
}
Matrix operator*(Matrix x, Matrix y) {
  Matrix z = Matrix();
  for (int i = 1; i <= trap; ++i)
    for (int k = 1; k <= trap; ++k)
      for (int j = 1; j <= trap; ++j) z.a[i][j] += x.a[i][k] * y.a[k][j];
  return z;
}
Matrix Power(Matrix c, int p) {
  Matrix z = Matrix();
  for (int i = 1; i <= trap; ++i) z.a[i][i] = 1;
  while (p) {
    if (p & 1) z = z * c;
    p >>= 1, c = c * c;
  }
  return z;
}
void init() {
  for (int i = 1; i <= n; ++i) G[i][i] = rev[i][i] = 1;
}
void add(int i, int j) {
  d[i]++, d[j]++;
  con[i][j]++, con[j][i]++;
  if (!jud[j]) G[i][j]--;
  if (!jud[i]) G[j][i]--;
}
double calc(int i, int j) {
  double ans = 0;
  for (int k = 1; k <= n; ++k) ans = ans + rev[i][k] * con[k][j];
  return ans;
}
void printG() {
  puts("------------------------------------------");
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) printf("%.5f%c", G[i][j], j == n ? '\n' : ' ');
}
void printR() {
  puts("------------------------------------------");
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      printf("%.5f%c", rev[i][j], j == n ? '\n' : ' ');
}
void Gauss() {
  int j = 0;
  for (int i = 1; i <= n; ++i) {
    for (j = i; j <= n; ++j)
      if (sgn(G[j][i])) break;
    if (i != j)
      for (int k = 1; k <= n; ++k)
        std::swap(G[i][k], G[j][k]), std::swap(rev[i][k], rev[j][k]);
    double c = G[i][i];
    for (j = 1; j <= n; ++j) G[i][j] /= c, rev[i][j] /= c;
    for (j = 1; j <= n; ++j) {
      if (i == j) continue;
      if (!sgn(G[j][i])) continue;
      double tmp = G[j][i];
      for (int k = 1; k <= n; ++k) {
        G[j][k] -= tmp * G[i][k];
        rev[j][k] -= tmp * rev[i][k];
      }
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &K);
  init();
  for (int i = 1; i <= n; ++i) scanf("%d", &jud[i]);
  for (int i = 1; i <= n; ++i)
    if (jud[i]) tr[++trap] = i;
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
  }
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if (i != j) con[i][j] /= d[i], G[i][j] /= d[i];
  Gauss();
  for (int i = 1; i <= trap; ++i)
    for (int j = 1; j <= trap; ++j) trans.a[i][j] = calc(tr[i], tr[j]);
  for (int i = 1; i <= trap; ++i) pr[i] = calc(1, tr[i]);
  val = Power(trans, K - 2);
  double ans = 0;
  for (int i = 1; i <= trap; ++i) ans += pr[i] * val.a[i][trap];
  printf("%.10f\n", ans);
  return 0;
}
