#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; // using mint = modint1000000007; template using vec = vector; template using pa = pair; template using mipq = priority_queue, greater>; #define REP(_1, _2, _3, _4, name, ...) name #define REP1(i, n) for (auto i = decay_t{}; (i) < (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) < (r); ++(i)) #define REP3(i, l, r, d) for (auto i = (l); (i) < (r); i += (d)) #define rep(...) REP(__VA_ARGS__, REP3, REP2, REP1)(__VA_ARGS__) #define rrep(i, r, l) for (int i = (r); i >= (l); --i) template bool chmax(T &a, const T &b) { return (a < b ? a = b, true : false); } template bool chmin(T &a, const T &b) { return (a > b ? a = b, true : false); } constexpr int INF = 1 << 30; constexpr ll LINF = 1LL << 60; constexpr int mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; void solve(); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); int T = 1; cin >> T; while (T--) solve(); } void solve() { int N, M; cin >> N >> M; dsu d(N); vec> expr; vec> G(N); rep(i, M) { int a, b, c; cin >> a >> b >> c; a--; b--; if (c == 1) { G[a].push_back(b); G[b].push_back(a); } else { expr.emplace_back(a, b); } } auto bfs = [&] (int i) { vec dist(N, INF); dist[i] = 0; queue q; q.push(i); while (!q.empty()) { int j = q.front(); q.pop(); for (auto k : G[j]) { if (dist[k] == INF) { dist[k] = dist[j] + 1; q.push(k); } } } return dist; }; vec d1 = bfs(0), d2 = bfs(N - 1); if (d1[N - 1] < INF) { cout << "Same\n" << d1[N - 1] << '\n'; return; } int ans = INF; for (auto [a, b] : expr) { if (d1[a] < INF) chmin(ans, d1[a] + d2[b] + 1); if (d1[b] < INF) chmin(ans, d1[b] + d2[a] + 1); } if (ans < INF) { cout << "Different\n" << ans << '\n'; } else { cout << "Unknown\n"; } }