下面的代码加上 #define int LL 能少RE几个点,很奇怪
#include<bits/stdc++.h>
#define log(a) cerr<<"\033[32m[DEBUG] "<<#a<<'='<<(a)<<" @ line "<<__LINE__<<"\033[0m"<<endl
#define LL long long
#define SZ(x) ((int)x.size()-1)
#define ms(a,b) memset(a,b,sizeof a)
#define F(i,a,b) for(int i=(a);i<=(b);++i)
#define DF(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
inline int read(){char ch=getchar(); int w=1,c=0;
for(;!isdigit(ch);ch=getchar()) if (ch=='-') w=-1;
for(;isdigit(ch);ch=getchar()) c=(c<<1)+(c<<3)+(ch^48);
return w*c;
}
const int N=5e5+10,MOD=1e9+7,C=32;
vector<pair<int,int> >v[N];
int f[N],ans=1;
queue<int>q;
int Quickpow(int x,int y){
int ans=1;
for(;y;x=(LL)x*x%MOD,y>>=1)
if(y&1)ans=(LL)ans*x%MOD;
return ans;
}
struct Dictionary{
vector<pair<int,int> >v;
void Newnode(){
v.emplace_back(0,0);
}
Dictionary(){
Newnode();
}
inline void insert(int x){
int id=0;
DF(i,C,0){
int&y=(x>>i)&1?v[id].second:v[id].first;
if(!y){
y=v.size();
Newnode();
}id=y;
}
// log(v[30].first);log(v[30].second);
// log(x);
// log(id);
}
int query(int x,int y,int id){
// cout<<x<<" "<<y<<" "<<id<<" "<<v[id].first<<" "<<v[id].second<<endl;
if(y<0)return 1;
if((x>>y)&1){
return ((v[id].first?query(x,y-1,v[id].first):Quickpow(2,y))+(v[id].second?query(x,y-1,v[id].second):Quickpow(2,y)))%MOD;
// if(!v[id].first||!v[id].second)return (1<<y);
// return (query(x,y-1,v[id].first)+query(x,y-1,v[id].second))%MOD;
}
if(v[id].first&&v[id].second)return 0;
if(v[id].first)return query(x,y-1,v[id].first);
return query(x,y-1,v[id].second);
}
};
signed main(){
int n=read(),m=read(),k=read();
F(i,1,m){
int x=read(),y=read(),z=read();
v[x].emplace_back(y,z);
v[y].emplace_back(x,z);
}
ms(f,-1);
F(i,1,n){
if(~f[i])continue;
Dictionary T;
q.push(i);
f[i]=0;
while(q.size()){
int x=q.front();q.pop();
// cout<<x<<" "<<f[x]<<endl;
T.insert(f[x]);
for(auto[j,k]:v[x]){
if(((f[x]^k)^f[j])&&(~f[j])){
// log(f[x]);log(f[i]);
// log(i);
puts("0");
return 0;
}
if(~f[j])continue;
f[j]=f[x]^k;
q.push(j);
}
}
// log(T.query(k,30,0));
ans=(LL)ans*T.query(k,C,0)%MOD;
// log(ans);
}
cout<<ans;
return 0;
}