#include using namespace std; # pragma GCC target("avx2") # pragma GCC optimize("O3") # pragma GCC optimize("unroll-loops") using ll=long long; using current=pair>; int nibutan(int n, vector A, int key){ int ok=n; int ng=-1; while(ok-ng>1){ int mid=(ok+ng)/2; if(A[mid]>key){ ok=mid; }else{ ng=mid; } } return ok; } void update(int i, int n, int x, vector &data){ i+=n-1; data[i]= x; while(i>1){ i/=2; data[i]=max(data[i*2], data[i*2+1]); } } int get(int n, int l, int r, vector &data){ int res=0; l+=n-1; r+=n-1; while(r>l){ if(l&1){ res=max(data[l], res); l++; } l>>=1; if(r&1){ r--; res=max(res, data[r]); } r>>=1; } return res; } int main(){ int T; cin >> T; for(int o=0;o> N >> M; vector>> G(N+1); for(int i=0;i> a >> b >> c; G[a].push_back({b, c}); G[b].push_back({a, c}); } vector res(N+1, 0), dist(N+1, -1); vector seen(N+1, false); queue q; res[1]=1; dist[1]=0; seen[1]=true; q.push(1); while(!q.empty()){ int p=q.front(); for(pair r:G[p]){ int nex=r.first; int c=r.second; if(seen[nex]){ continue; } seen[nex]=true; if(c==1){ res[nex]=res[p]; }else{ res[nex]=3-res[p]; } dist[nex]=dist[p]+1; q.push(nex); } q.pop(); } if(res[N]==0){ cout << "Unknown" << endl; continue; } if(res[N]==1){ cout << "Same"; }else{ cout << "Different"; } cout << endl; cout << dist[N] << endl; } }