#include using namespace std; // #include // using namespace atcoder; // using mint = modint998244353; using ll = long long; #define fix(x) fixed << setprecision(x) #define rep(i, n) for(int i = 0; i < n; ++i) #define all(x) (x).begin(),(x).end() templatebool chmin(T&a, const T&b){if(a>b){a=b;return 1;}return 0;} templatebool chmax(T&a, const T&b){if(a par, siz; UnionFind(int N) : par(N), siz(N,1){ rep(i,N) par[i] = i; cnt = N; } int root(int x){ if(par[x]==x) return x; return par[x] = root(par[x]); } bool unite(int x,int y){ x = root(x); y = root(y); if(x==y) return false; --cnt; if(siz[x]> t; while(t--){ int n,m; cin >> n >> m; vector> g(n); UnionFind uf(n); vector> a; rep(i,m){ int u,v,c; cin >> u >> v >> c; --u, --v; if(c==1){ uf.unite(u,v); g[u].emplace_back(v); g[v].emplace_back(u); }else a.emplace_back(u,v); } if(uf.same(0,n-1)){ vector dist(n,INF); dist[0] = 0; queue que; que.emplace(0); while(que.size()){ int now = que.front(); que.pop(); for(int x:g[now]){ if(chmin(dist[x],dist[now]+1)){ que.emplace(x); } } } cout << "Same\n" << dist[n-1] << '\n'; }else{ for(auto [u,v]:a){ g[u].emplace_back(v); g[v].emplace_back(u); uf.unite(u,v); } if(uf.same(0,n-1)){ vector dist(n,INF); dist[0] = 0; queue que; que.emplace(0); while(que.size()){ int now = que.front(); que.pop(); for(int x:g[now]){ if(chmin(dist[x],dist[now]+1)){ que.emplace(x); } } } cout << "Different\n" << dist[n-1] << '\n'; }else{ cout << "Unknown\n"; } } } return 0; }