#include using namespace std; #define rep(i, l, n) for(int i = int(l); i < int(n); ++i) #define ll long long #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() template bool chmin(T &a, T b) {if(a > b) {a = b; return true;} return false;} template bool chmax(T &a, T b) {if(a < b) {a = b; return true;} return false;} template using spq = priority_queue, greater>; // bool -> Yes/No string answer(bool b) {return b ? "Yes" : "No";} void fix(int k) {cout << fixed << setprecision(k);} const int inf = 1000000009; const long long INF = 2000000000000000009; const long double eps = 1e-12; const long double pi = acos(-1); int dx[] = {0, -1, 0, 1, -1, -1, 1, 1}, dy[] = {1, 0, -1, 0, 1, -1, -1, 1}; void jdg(bool b) { if(!b) { int c = 0; while(c++) {} } } int N, M; vector G[2][200003]; int dist[2][200003]; void solve() { cin >> N >> M; jdg(N <= 200003); rep(i, 0, 2) rep(j, 0, N) G[i][j] = vector(); while(M--) { int a, b, c; cin >> a >> b >> c; if(a == 1 && b == N) { if(c == 1) {cout << "Same\n1\n"; return;} cout << "Different\n1\n"; return; } --a; --b; jdg(0 <= a && a < N); jdg(0 <= b && b < N); jdg(0 <= c - 1 && c - 1 < 2); G[c - 1][a].emplace_back(b); G[c - 1][b].emplace_back(a); } rep(i, 0, 2) { rep(j, 0, N) dist[i][j] = inf; int st = (i ? N - 1 : 0); jdg(0 <= st && st < N); dist[i][st] = 0; queue q; q.emplace(st); while(!q.empty()) { int v = q.front(); q.pop(); jdg(0 <= v && v < N); for(int u : G[0][v]) { jdg(0 <= u && u < N); if(chmin(dist[i][u], dist[i][v] + 1)) q.emplace(u); } } } if(dist[0][N - 1] < inf) { cout << "Same\n"; cout << dist[0][N - 1] << '\n'; return; } int mn = inf; rep(i, 0, N) if(dist[0][i] < inf) { jdg(0 <= i && i < N); for(int u : G[1][i]) { jdg(0 <= u && u < N); if(dist[1][u] < inf) { chmin(mn, 1 + dist[0][i] + dist[1][u]); } } } if(mn < inf) { cout << "Different\n"; cout << mn << '\n'; return; } cout << "Unknown\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T = 1; cin >> T; while(T--) solve(); }