#include #include #include #include #include using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(int i=0; i<(int)(n); i++) int N,M; vector> E; vector> A; i64 sum(array a){ i64 ans = 0; for(auto aa : a) ans += aa; return ans; } bool battle(array& a, array b){ if(sum(a) <= sum(b)) return false; if(a[0] < b[2]) swap(a[0], b[2]); return true; } bool battle2(array& a, array b){ if(sum(a) <= sum(b)) return false; array buf; rep(t,3) buf[t] = a[t]; rep(t,3) buf[3+t] = b[t]; sort(buf.begin(), buf.end()); rep(t,3) a[t] = buf[3+t]; return true; } bool solve(array P){ auto p = P; if(!battle(p, A[0])) return false; bool ok = false; for(auto e : E[0]) if(battle(p, A[e])) ok = true; if(!ok) return false; p = P; vector pushed(N, 0); vector vis(N, 0); priority_queue> Q; Q.push(make_pair(-sum(A[0]), 0)); pushed[0] = 1; //cout << " P = [ " << P[0] << ", " << P[1] << ", " << P[2] << " ]" << endl; while(Q.size()){ int v = Q.top().second; Q.pop(); if(!battle2(p, A[v])) break; //cout << " v = " << v << ", p = [ " << p[0] << ", " << p[1] << ", " << p[2] << " ]" << endl; vis[v] = 1; for(int e : E[v]) if(!pushed[e]){ Q.push(make_pair(-sum(A[e]), e)); pushed[e] = 1; } } return vis[N-1]; } int main(){ cin >> N >> M; E.resize(N); rep(i,M){ int u,v; cin >> u >> v; u--; v--; E[u].push_back(v); E[v].push_back(u); } A.resize(N); rep(i,N) rep(t,3){ cin >> A[i][t]; A[i][t]--; } rep(i,N) sort(A[i].begin(), A[i].end()); array ans; rep(t,3) ans[t] = 1<<30; { i64 ng = 0, ok = 1<<30; while(ng + 1 < ok){ i64 m = (ng+ok) / 2; array init = {}; init[2] = m; if(solve(init)) ok = m; else ng = m; } array tmp = {}; tmp[2] = ok; if(sum(ans) > sum(tmp)) ans = tmp; } rep(t,3){ if(t) cout << ' '; cout << (ans[t] + 1); } cout << '\n'; return 0; } struct ios_do_not_sync{ ios_do_not_sync(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); } } ios_do_not_sync_instance;