#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
const int mod1 = 1e9 + 7, mod2 = 1e9 + 9;
int n, m, i, j, vis[100005], fa[100005], dis[100005];
int a[131075], b[131075], c[131075], d[131075];
vector<pair<int, int> > e[100005];
void fwt(int *a, int mod) {
  int i, j;
  for (i = 1; i < 131072; i <<= 1) {
    for (((j)) = (0); ((j)) <= (((int)(131072)) - 1); ((j))++)
      if (i & j) {
        int x = a[j - i], y = a[j];
        a[j - i] = (x + y) % mod;
        a[j] = (x - y + mod) % mod;
      }
  }
}
void ifwt(int *a, int mod) {
  int i, j;
  for (i = 1; i < 131072; i <<= 1) {
    for (((j)) = (0); ((j)) <= (((int)(131072)) - 1); ((j))++)
      if (i & j) {
        int x = a[j - i], y = a[j];
        a[j - i] = 1ll * (mod + 1) / 2 * (x + y) % mod;
        a[j] = 1ll * (mod + 1) / 2 * (x - y + mod) % mod;
      }
  }
}
void dfs(int x, int pa) {
  fa[x] = pa;
  vis[x] = 1;
  int i;
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++)
    if (it->first != pa) {
      if (!vis[it->first]) {
        dis[it->first] = it->second;
        dfs(it->first, x);
      } else if (vis[it->first] == 1) {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        int z = it->first, y = x;
        while (y != z) {
          a[dis[y]]++;
          b[dis[y]]++;
          y = fa[y];
        }
        a[it->second]++;
        b[it->second]++;
        fwt(a, mod1);
        fwt(b, mod2);
        for (((i)) = (0); ((i)) <= (((int)(131072)) - 1); ((i))++) {
          c[i] = 1ll * a[i] * c[i] % mod1;
          d[i] = 1ll * b[i] * d[i] % mod2;
        }
      }
    }
  vis[x] = 2;
}
int main() {
  read(n);
  read(m);
  int sum = 0;
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    int x, y, z;
    read(x);
    read(y);
    read(z);
    sum ^= z;
    e[x].push_back(make_pair(y, z));
    e[y].push_back(make_pair(x, z));
  }
  c[sum] = d[sum] = 1;
  fwt(c, mod1);
  fwt(d, mod2);
  dfs(1, 0);
  ifwt(c, mod1);
  ifwt(d, mod2);
  for (i = 0; i < 131072; i++) {
    if (c[i] || d[i]) {
      printf("%d %d\n", i, c[i]);
      return 0;
    }
  }
  return 0;
}
