#include <bits/stdc++.h>   using namespace std;   const int max_n = 1e5 + 10;   const long long inf = 10000000000000000;   vector<int> adj[max_n];   vector<long long> cst[max_n];   vector<int> arr[max_n];   vector<long long> closest[max_n];   void cmp_closest(int i) {     int s = arr[i].size();     if (s > 0) {       closest[i].reserve(s);       closest[i][s - 1] = arr[i][s - 1] + 1;       for (int j = s - 2; j >= 0; --j) {         if (arr[i][j] + 1 != arr[i][j + 1]) {           closest[i][j] = arr[i][j] + 1;         } else {           closest[i][j] = closest[i][j + 1];         }       }     }   }   int n, m;   void add_edge(int a, int b, int c) {     adj[a].push_back(b);     cst[a].push_back(c);     adj[b].push_back(a);     cst[b].push_back(c);   }   void read() {     ios_base::sync_with_stdio(false);     cin >> n >> m;     for (int i = 0; i < m; ++i) {       int a, b, c;       cin >> a >> b >> c;       --a;       --b;       add_edge(a, b, c);     }     for (int i = 0; i < n; ++i) {       int k;       cin >> k;       for (int j = 0; j < k; ++j) {         long long t;         cin >> t;         arr[i].push_back(t);       }       cmp_closest(i);     }   }   long long dist[max_n];   struct cmpl {     inline bool operator()(int a, int b) const {       return (dist[a] < dist[b] || (dist[a] == dist[b] && a < b));     }   };   int cost(int u, size_t i) {     vector<int>::iterator it = lower_bound(arr[u].begin(), arr[u].end(), dist[u]);     if (it != arr[u].end() && *it == dist[u]) {       return cst[u][i] + (closest[u][it - arr[u].begin()]) - dist[u];     } else {       return cst[u][i];     }   }   set<int, cmpl> pq;   int main() {     read();     for (int i = 1; i < n; ++i) {       dist[i] = inf;     }     pq.insert(0);     int res = -1;     while (!pq.empty()) {       int curr = *pq.begin();       pq.erase(pq.begin());       if (curr == n - 1) {         res = dist[curr];         break;       } else {         for (size_t i = 0; i < adj[curr].size(); ++i) {           int v = adj[curr][i];           int c = cost(curr, i);           if (dist[curr] + c < dist[v]) {             pq.erase(v);             dist[v] = dist[curr] + c;             pq.insert(v);           }         }       }     }     cout << res << endl;     return 0;   }   