#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 17;
const int MOD = 1e9 + 7, mod2 = 1e9 + 9;
const int inv2 = (MOD + 1) / 2;
int n, m, u, v, w, vis[N], dfn[N], y, ans, c[44], t;
pair<int, int> now[N];
vector<pair<int, int> > e[N];
long long cnt[44][N], ex[44][N], res;
void FWT_xor(long long *a, int opt, int MOD) {
  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;
      }
}
void dfs(int u, int fa, int ww) {
  vis[u] = 1;
  now[++y] = pair<int, int>(u, ww);
  dfn[u] = y;
  for (auto &x : e[u]) {
    int v = x.first, w = x.second;
    if (v == fa) continue;
    if (!vis[v]) {
      dfs(v, u, w);
    } else if (vis[v] == 1) {
      ++t;
      cnt[t][w]++;
      ex[t][w]++;
      for (int i = dfn[u]; i > dfn[v]; --i) {
        int z = now[i].second;
        cnt[t][z]++;
        ex[t][z]++;
      }
    }
  }
  --y;
  vis[u] = 2;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    ans ^= w;
    e[u].push_back(pair<int, int>(v, w));
    e[v].push_back(pair<int, int>(u, w));
  }
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      dfs(i, -1, 0);
    }
  }
  cnt[0][ans] = ex[0][ans] = 1;
  FWT_xor(cnt[0], 1, MOD);
  FWT_xor(ex[0], 1, mod2);
  for (int i = 1; i <= t; ++i) {
    FWT_xor(cnt[i], 1, MOD);
    FWT_xor(ex[i], 1, mod2);
    for (int j = 0; j < N; ++j) {
      cnt[i][j] = 1ll * cnt[i - 1][j] * cnt[i][j] % MOD;
      ex[i][j] = 1ll * ex[i - 1][j] * ex[i][j] % mod2;
    }
  }
  FWT_xor(cnt[t], -1, MOD);
  FWT_xor(ex[t], -1, mod2);
  for (int i = 0; i < N; ++i) {
    if (!cnt[t][i] && !ex[t][i]) continue;
    printf("%d %d", i, cnt[t][i]);
    break;
  }
  return 0;
}
