#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline void io(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
const int MAX_SIZE = 1e5+1;
vector<vector<pair<int,int>>> adjList(MAX_SIZE,vector<pair<int,int>>());
vector<map<int,int>> trav(MAX_SIZE,map<int,int>());
ll d[MAX_SIZE];
long long dijsktra(int n){
int src = 1,dest = n;
for(int i=0;i<=n;i++)d[i] = INT_MAX;
d[src] = 0;
priority_queue<pair<int,int>> q;
q.push({0,src});
while(!q.empty()){
int v = q.top().second;
int dis = q.top().first*-1;
q.pop();
if(v==n)return dis;
if(d[v]<dis)continue;
for(auto e : adjList[v]){
int to = e.first;
int len = e.second;
int t = d[v];
while(trav[v].find(t)!=trav[v].end())t++;
t+=len;
if(t < d[to]){
// q.erase({d[to],to});
d[to] = t;
q.push({-d[to],to});
}
}
}
if(d[n]==INT_MAX)d[n]=-1;
return d[n];
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
adjList.at(a).push_back({b,c});
adjList.at(b).push_back({a,c});
}
for(int i=0;i<n;i++){
int k;
scanf("%d",&k);
while(k--){
int t;
scanf("%d",&t);
trav.at(i+1).insert({t,1});
}
}
printf("%d\n",dijsktra(n));
}