#include #include #include using namespace std; long long N, M, P, X[309], Y[309], T[309], L[309], R[309], col[309]; vector>G[309]; vectorI, J; bool flag = false; vector Gauss(vectorX) { sort(X.begin(), X.end()); for (int i = 59; i >= 0; i--) { for (int j = 0; j < X.size(); j++) { if ((X[j] & (1LL << i)) != 0) { for (int k = j + 1; k < X.size(); k++) { if ((X[k] & (1LL << i)) != 0) X[k] ^= X[j]; } break; } } sort(X.begin(), X.end()); } return X; } void dfs(int pos, int dep) { if (col[pos] >= 0) { if (col[pos] != dep) flag = true; return; } col[pos] = dep; J.push_back(pos); for (int i = 0; i < G[pos].size(); i++) dfs(G[pos][i].first, dep ^ G[pos][i].second); } int main() { cin >> N >> M >> P; for (int i = 1; i <= N; i++) cin >> X[i]; for (int i = 0; i <= N; i++) Y[i] = (X[i] ^ X[i + 1]); for (int i = 0; i < M; i++) { cin >> T[i] >> L[i] >> R[i]; G[L[i] - 1].push_back(make_pair(R[i], T[i])); G[R[i]].push_back(make_pair(L[i] - 1, T[i])); } for (int i = 0; i <= N; i++) col[i] = -1; for (int i = 0; i <= N; i++) { if (col[i] >= 0) continue; J.clear(); dfs(i, 0); long long E1 = 0; for (int j : J) E1 ^= (Y[j] * col[j]); P ^= E1; if (i != 0) { long long E2 = 0; for (int j : J) E2 ^= (Y[j] * (1 - col[j])); I.push_back(E2 ^ E1); } } if (flag == true) { cout << "0" << endl; return 0; } I = Gauss(I); sort(I.begin(), I.end()); reverse(I.begin(), I.end()); long long cx = P; for (int i = 0; i < I.size(); i++) { long long P1 = cx; long long P2 = (cx ^ I[i]); cx = min(P1, P2); } if (cx != 0) cout << "0" << endl; else { long long ret = 1; for (int i = 0; i < I.size(); i++) { if (I[i] == 0) ret *= 2; ret %= 1000000007; } cout << ret << endl; } return 0; }