#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 17;
const int mod1 = 1e9 + 7;
const int mod2 = 998244353;
std::vector<pair<int, int> > G[N];
std::vector<std::vector<int> > V;
int fa[N], w[N], dfn[N], idx, sum;
int f[N << 1], g[N << 1], ff[N << 1], gg[N << 1], n, m;
void dfs(int x, int f) {
  dfn[x] = ++idx;
  for (auto y : G[x]) {
    if (y.first == f) continue;
    if (dfn[y.first] > dfn[x]) {
      int tmp = y.second;
      for (int i = y.first; i != x; i = fa[i]) tmp ^= w[i];
      std::vector<int> v;
      v.push_back(tmp ^ y.second);
      for (int i = y.first; i != x; i = fa[i]) v.push_back(tmp ^ w[i]);
      V.push_back(v);
      sum ^= tmp;
    } else if (!dfn[y.first]) {
      fa[y.first] = x;
      w[y.first] = y.second;
      dfs(y.first, x);
    }
  }
}
void FWT_xor(int *a, int opt, int MOD) {
  int inv2 = (MOD + 1) / 2;
  for (int i = 1; i < N; i <<= 1)
    for (int p = i << 1, j = 0; j < N; j += p)
      for (int k = 0; k < i; ++k) {
        int X = a[j + k], Y = a[i + j + k];
        a[j + k] = (X + Y) % MOD;
        a[i + j + k] = (X + MOD - Y) % MOD;
        if (opt == -1)
          a[j + k] = 1ll * a[j + k] * inv2 % MOD,
                a[i + j + k] = 1ll * a[i + j + k] * inv2 % MOD;
      }
}
int main(int argc, char const *argv[]) {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y, w;
    scanf("%d%d%d", &x, &y, &w);
    G[x].push_back({y, w});
    G[y].push_back({x, w});
    sum ^= w;
  }
  dfs(1, 0);
  f[sum] = g[sum] = 1;
  FWT_xor(f, 1, mod1);
  FWT_xor(g, 1, mod2);
  for (auto v : V) {
    memset(ff, 0, sizeof(ff));
    memset(gg, 0, sizeof(gg));
    for (auto x : v) ff[x]++, gg[x]++;
    FWT_xor(ff, 1, mod1);
    FWT_xor(gg, 1, mod2);
    for (int i = 0; i < 1 << 17; i++) {
      f[i] = (long long)f[i] * ff[i] % mod1;
      g[i] = (long long)g[i] * gg[i] % mod2;
    }
  }
  FWT_xor(f, -1, mod1);
  FWT_xor(g, -1, mod2);
  for (int i = 0; i < 1 << 17; i++)
    if (f[i] || g[i]) {
      printf("%d %d\n", i, f[i]);
      break;
    }
  return 0;
}
