#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 solve() { int N, M; cin >> N >> M; vector> G[2]; rep(i, 0, 2) G[i] = vector>(N, vector(0)); 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; G[c - 1][a].emplace_back(b); G[c - 1][b].emplace_back(a); } /*vector dist[2]; rep(i, 0, 2) { dist[i] = vector(N, inf); int st = (i ? N - 1 : 0); dist[i][st] = 0; queue q; q.emplace(st); while(!q.empty()) { int v = q.front(); q.pop(); for(int u : G[0][v]) { 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) { for(int u : G[1][i]) { if(dist[1][u] < inf) { chmin(mn, 1 + dist[0][i] + dist[1][u]); } } } if(mn < inf) { cout << "Different\n"; cout << mn << '\n'; } else cout << "Unknown\n";*/ } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T = 1; cin >> T; while(T--) solve(); }