#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, x[45], y[45], z[45], ct, ans, ans2, fx, fy, xx, yy, zz,
    f[110000], fv[110000], xorv, et, be[110000], dep[110000], fa[110000];
const int p = 1e9 + 7, inv2 = (p + 1) >> 1, bm = 131072, p2 = 999999197,
          inv22 = (p2 + 1) >> 1;
long long g[bm + 50], h[bm + 50], g2[bm + 50], h2[bm + 50];
struct edg {
  int y, ne, z;
} e[220000];
inline void add_edge(int x, int y, int z) {
  e[++et].y = y;
  e[et].ne = be[x];
  e[et].z = z;
  be[x] = et;
}
inline int father(int x) {
  if (f[x] != x) f[x] = father(f[x]);
  return f[x];
}
void dfs(int x, int ff) {
  fa[x] = ff;
  for (int i = be[x]; i; i = e[i].ne)
    if (e[i].y != ff) {
      dep[e[i].y] = dep[x] + 1;
      fv[e[i].y] = e[i].z;
      dfs(e[i].y, x);
    }
}
void lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  while (dep[x] > dep[y]) {
    h[fv[x]]++;
    h2[fv[x]]++;
    x = fa[x];
  }
  while (x != y) {
    h[fv[x]]++;
    h2[fv[x]]++;
    x = fa[x];
    h[fv[y]]++;
    h2[fv[y]]++;
    y = fa[y];
  }
}
long long X, Y;
inline void FWT(long long *a, int opt, int p) {
  int inv = (p + 1) >> 1;
  for (int i = 1; i < bm; i <<= 1)
    for (int j = 0; j < bm; j += (i << 1))
      for (int k = 0; k < i; ++k) {
        X = a[j + k];
        Y = a[i + j + k];
        a[j + k] = X + Y;
        if (a[j + k] >= p) a[j + k] -= p;
        a[i + j + k] = X - Y;
        if (a[i + j + k] < 0) a[i + j + k] += p;
        if (opt == -1) {
          a[j + k] = a[j + k] * inv % p;
          a[i + j + k] = a[i + j + k] * inv % p;
        }
      }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) f[i] = i;
  cnt = n;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &xx, &yy, &zz);
    xorv ^= zz;
    fx = father(xx);
    fy = father(yy);
    if (fx != fy) {
      add_edge(xx, yy, zz);
      add_edge(yy, xx, zz);
      f[fx] = fy;
      cnt--;
    } else {
      x[++ct] = xx;
      y[ct] = yy;
      z[ct] = zz;
    }
  }
  dfs(1, 0);
  g[0] = 1;
  g2[0] = 1;
  FWT(g, 1, p);
  FWT(g2, 1, p2);
  for (int i = 1; i <= ct; i++) {
    memset(h, 0, sizeof h);
    memset(h2, 0, sizeof h2);
    h[z[i]]++;
    h2[z[i]]++;
    lca(x[i], y[i]);
    FWT(h, 1, p);
    FWT(h2, 1, p2);
    for (int i = 0; i <= bm - 1; i++) {
      g[i] = g[i] * h[i] % p;
      g2[i] = g2[i] * h2[i] % p2;
    }
  }
  FWT(g, -1, p);
  FWT(g2, -1, p2);
  ans = 0x3fffffff;
  for (int i = 0; i <= bm - 1; i++)
    if ((g[i] || g2[i]) && ((i ^ xorv) < ans)) {
      ans = i ^ xorv;
      ans2 = g[i];
    }
  printf("%d %d\n", ans, ans2);
  return 0;
}
