#include <bits/stdc++.h>
using namespace std;
const long long N = 250005, M1 = 1e9 + 7, Inv1 = M1 / 2 + 1, M2 = 998244353,
                Inv2 = M2 / 2 + 1;
long long ne[N], tot, zz[N], sl[N], Stack[N], flag[N], dfn[N], low[N], x, y, z,
    n;
long long m, a[50][N], dp2[N], fi[N], cnt, l, in[N], dp1[N];
inline void fwt(long long y[], long long opt, long long M, long long Inv) {
  for (long long i = 1; i < 1 << 17; i <<= 1)
    for (long long j = 0, p = i << 1; j < 1 << 17; j += p)
      for (long long k = j; k < j + i; k++) {
        long long u = y[k], v = y[k + i];
        y[k] = u + v;
        if (y[k] >= M) y[k] -= M;
        y[k + i] = u - v;
        if (y[k + i] < 0) y[k + i] += M;
        if (opt == -1) y[k] = (y[k] * Inv) % M, y[k + i] = (y[k + i] * Inv) % M;
      }
}
void jb(long long x, long long y, long long z) {
  ne[++tot] = fi[x];
  fi[x] = tot;
  zz[tot] = y;
  sl[tot] = z;
}
void dfs(long long x, long long y) {
  Stack[++tot] = x;
  flag[x] = 1;
  dfn[x] = low[x] = ++l;
  for (long long i = fi[x]; i; i = ne[i])
    if (zz[i] != y) {
      if (!dfn[zz[i]])
        dfs(zz[i], x), low[x] = min(low[x], low[zz[i]]);
      else if (flag[zz[i]])
        low[x] = min(low[x], dfn[zz[i]]);
    }
  if (low[x] == dfn[x]) {
    if (Stack[tot] == x) {
      flag[Stack[tot]] = 0;
      tot--;
      return;
    }
    cnt++;
    while (Stack[tot] != x) {
      flag[Stack[tot]] = 0;
      in[Stack[tot]] = cnt;
      tot--;
    }
    flag[x] = 0;
    in[Stack[tot]] = cnt;
    tot--;
  }
}
signed main() {
  scanf("%lld%lld", &n, &m);
  long long ans = 0;
  while (m--) {
    scanf("%lld%lld%lld", &x, &y, &z);
    jb(x, y, z);
    jb(y, x, z);
    ans ^= z;
  }
  tot = 0;
  dfs(1, 0);
  for (long long i = 1; i <= n; i++)
    if (in[i])
      for (long long j = fi[i]; j; j = ne[j])
        if (in[zz[j]] == in[i] && zz[j] < i) a[in[i]][sl[j]]++;
  dp1[0] = dp2[0] = 1;
  fwt(dp1, 1, M1, Inv1);
  fwt(dp2, 1, M2, Inv2);
  for (long long i = 1; i <= cnt; i++) {
    fwt(a[i], 1, M1, Inv1);
    for (long long j = 0; j < 1 << 17; j++) (dp1[j] *= a[i][j]) %= M1;
  }
  for (long long i = 1; i <= cnt; i++) {
    fwt(a[i], -1, M1, Inv1);
    fwt(a[i], 1, M2, Inv2);
    for (long long j = 0; j < 1 << 17; j++) (dp2[j] *= a[i][j]) %= M2;
  }
  fwt(dp1, -1, M1, Inv1);
  fwt(dp2, -1, M2, Inv2);
  long long Max = 1e9, Ans = 0;
  for (long long i = 0; i < 1 << 17; i++)
    if ((i ^ ans) < Max && (dp1[i] || dp2[i])) Ans = dp1[i], Max = i ^ ans;
  printf("%lld %lld\n", Max, Ans);
}
