#include <bits/stdc++.h>
using namespace std;
long long int n;
long long int m;
long long int elek[200001];
long long int mut[200001];
long long int pont[200001];
bool sulyok[200001];
long long int kim;
int komp[200001];
bool bejar(long long int p, int kom) {
  if (komp[p] != 0) {
    if (komp[p] != kom) {
      return true;
    }
    return false;
  }
  komp[p] = kom;
  if (kom == 1) {
    for (int q = pont[p]; q > 0; q = mut[q]) {
      if (sulyok[q]) {
        if (bejar(elek[q], 1)) return true;
      } else {
        if (bejar(elek[q], 2)) return true;
      }
    }
  } else {
    for (int q = pont[p]; q > 0; q = mut[q]) {
      if (sulyok[q]) {
        if (bejar(elek[q], 2)) return true;
      } else {
        if (bejar(elek[q], 1)) return true;
      }
    }
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> elek[2 * i - 1] >> elek[2 * i] >> sulyok[2 * i];
    sulyok[2 * i - 1] = sulyok[2 * i];
    mut[2 * i - 1] = pont[elek[2 * i]];
    mut[2 * i] = pont[elek[2 * i - 1]];
    pont[elek[2 * i]] = 2 * i - 1;
    pont[elek[2 * i - 1]] = 2 * i;
  }
  kim = 1;
  if (bejar(1, 1)) {
    cout << 0 << endl;
    return 0;
  }
  for (int i = 2; i <= n; i++) {
    if (komp[i] == 0) {
      if (bejar(i, 1)) {
        cout << 0 << endl;
        return 0;
      }
      kim = (kim * 2) % 1000000007;
    }
  }
  cout << kim << endl;
  return 0;
}
