#include using namespace std; using lint = long long int; using P = pair; using PL = pair; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) #define ALL(a) (a).begin(),(a).end() constexpr int MOD = 1000000007; constexpr lint B1 = 1532834020; constexpr lint M1 = 2147482409; constexpr lint B2 = 1388622299; constexpr lint M2 = 2147478017; constexpr int INF = 2147483647; void yes(bool expr) {cout << (expr ? "YES" : "NO") << "\n";} templatevoid chmax(T &a, const T &b) { if (avoid chmin(T &a, const T &b) { if (b> N >> M; vector c(M); vector> s(M); vector> itg(N); REP(i, M) { lint k; cin >> k >> c[i]; REP(j, k) { int ss; cin >> ss; ss--; s[i].push_back(ss); itg[ss].push_back(i); } } vector dp(N, 1e18); dp[0] = 0; multiset st; st.insert(PL(0, 0)); vector used(M); while(!st.empty()) { PL pl = *st.begin(); st.erase(pl); int idx = pl.second; lint d = pl.first - idx/2; for(int x : itg[idx]) { if(!used[x]) { used[x] = true; for(int y : s[x]) { lint tmp = (lint)(idx + y + 1) / 2 + 1 + c[x] + d; if(tmp < dp[y]) { dp[y] = tmp; st.insert(PL(tmp + y/2, y)); } } } } } if(dp[N-1] == 1e18) cout << -1 << endl; else cout << dp[N-1] << endl; }