#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const long long LLINF = 9223372036854775807LL;
const int maxn = 510;
bool trap[maxn];
vector<int> a[maxn];
valarray<double> v[maxn];
int sm[maxn][maxn];
int deg[maxn];
const int maxk = 110;
int K;
struct matr {
  double a[maxk][maxk];
  matr() { memset(a, 0, sizeof(a)); }
  matr operator*(const matr& o) const {
    matr res;
    for (int i = 0; i < K; ++i)
      for (int j = 0; j < K; ++j)
        for (int k = 0; k < K; ++k) res.a[i][j] += a[i][k] * o.a[k][j];
    return res;
  }
  matr pow(int n) {
    matr res;
    for (int i = 0; i < K; ++i) res.a[i][i] = 1;
    matr t = *this;
    while (n) {
      if (n & 1) res = res * t;
      t = t * t;
      n >>= 1;
    }
    return res;
  }
};
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  K = 1;
  for (int i = 0; i < n; ++i) {
    int cur;
    scanf("%d", &cur);
    trap[i] = cur;
    K += cur;
  }
  for (int i = 0; i < m; ++i) {
    int fr, to;
    scanf("%d%d", &fr, &to);
    --fr, --to;
    deg[fr]++;
    deg[to]++;
    sm[fr][to]++;
    sm[to][fr]++;
    a[fr].push_back(to);
    a[to].push_back(fr);
  }
  int N = n + n;
  for (int i = 0; i < n; ++i) {
    v[i].resize(N);
    v[i][n + i] += 1, v[i][i] += 1;
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < int((a[i]).size()); ++j) {
      int to = a[i][j];
      if (!trap[to]) v[i][to] -= 1. / int((a[i]).size());
    }
  }
  for (int i = 0; i < n; ++i) {
    int ind = i;
    for (int r = i; r < n; ++r)
      if (fabs(v[r][i]) > fabs(v[ind][i])) ind = r;
    swap(v[i], v[ind]);
    double dd = v[i][i];
    v[i] /= dd;
    for (int r = 0; r < n; ++r) {
      if (r == i) continue;
      dd = v[r][i];
      v[r] -= v[i] * dd;
    }
  }
  vector<int> p;
  p.push_back(0);
  for (int i = 0; i < n; ++i)
    if (trap[i]) p.push_back(i);
  assert(int((p).size()) == K);
  matr mm;
  for (int ii = 0; ii < K; ++ii) {
    int fr = p[ii];
    for (int jj = 0; jj < K; ++jj) {
      int to = p[jj];
      if (to == 0) continue;
      double val = 0;
      for (int tt = 0; tt < n; ++tt) {
        val += v[fr][n + tt] * sm[to][tt] / (double)deg[tt];
      }
      mm.a[ii][jj] = val;
    }
  }
  matr mk = mm.pow(k - 1);
  double result = mk.a[0][K - 1];
  printf("%.15lf\n", result);
  return 0;
}
