#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
int p[N];
map<long long, set<int>> nums;
int find(int x) {
  if (p[x] == x) {
    return x;
  }
  return p[x] = find(p[x]);
}
bool merge(int a, int b) {
  a = find(a);
  b = find(b);
  if (a == b) {
    return false;
  }
  if (rand() & 1) {
    swap(a, b);
  }
  p[a] = b;
  return true;
}
const int MOD = 1e9 + 7;
int mul(int a, int b) { return 1LL * a * b % MOD; }
int mpow(int a, int n) {
  int res = 1;
  for (; n > 0; n >>= 1) {
    if (n & 1) res = mul(res, a);
    a = mul(a, a);
  }
  return res;
}
void add(int &a, int x) {
  a += x;
  if (a >= MOD) {
    a -= MOD;
  }
}
map<long long, vector<pair<int, int>>> edges;
set<long long> values;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie();
  int n, m, k;
  cin >> n >> m >> k;
  vector<long long> c(n + 1);
  for (int i = 1; i <= n; ++i) {
    cin >> c[i];
  }
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    long long x = c[u] ^ c[v];
    edges[x].push_back({u, v});
    nums[x].insert(u);
    nums[x].insert(v);
    values.insert(x);
  }
  long long tot = (1LL << k);
  tot -= values.size();
  tot = tot % MOD;
  int ans = 1LL * tot * mpow(2, n) % MOD;
  for (auto v : values) {
    for (int node : nums[v]) {
      p[node] = node;
    }
    int cc = n;
    for (auto pp : edges[v]) {
      int p = pp.first;
      int q = pp.second;
      if (merge(p, q)) {
        cc--;
      }
    }
    add(ans, mpow(2, cc));
  }
  cout << ans << '\n';
  return 0;
}
