#include using namespace std; using ll = long long; template struct csr { struct Node { csr* g; int u; template void emplace_back(Args&&... args){ g->add_edge(u, T(std::forward(args)...)); } auto begin(){ return g->E.begin() + g->start[u]; } auto end(){ return g->E.begin() + g->start[u + 1]; } int size(){ return g->start[u + 1] - g->start[u]; } T& operator[](int p){ return *(begin() + p); } }; int N; std::vector start; std::vector E; std::vector> edge; csr(int n) : N(n), start(n + 1) {edge.reserve(n);} void add_edge(int u, T v){ assert(0 <= u && u < N); start[u + 1]++; edge.emplace_back(u, v); } void build(){ E.resize(edge.size()); for(int i = 0; i < N; i++) start[i + 1] += start[i]; auto cnt = start; for(auto [u, v] : edge) E[cnt[u]++] = v; } const int size() {return N;} Node operator[](int u) {return Node{this, u};} }; deque que; void solve(){ int n, m; cin >> n >> m; csr> g(n); for(int i = 0; i < m; i++){ int u, v, w; cin >> u >> v >> w; u--, v--, w--; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } g.build(); vector dp(n, -1), dp2(n); que.emplace_back(0); dp[0] = 0; while(!que.empty()){ int v = que.front(); que.pop_front(); for(auto &&[u, w] : g[v]){ if(dp[u] != -1) continue; if(w == 0){ dp[u] = dp[v]; dp2[u] = dp2[v] + 1; que.emplace_front(u); }else{ dp[u] = dp[v] + w; dp2[u] = dp2[v] + 1; que.emplace_front(u); } } } if(dp.back() == -1 || dp.back() >= 2){ cout << "Unknown\n"; }else{ cout << (dp[0] == dp[n - 1] ? "Same" : "Different") << '\n'; cout << dp2[n - 1] << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while(T--) solve(); }