#include<bits/stdc++.h>
#define bigg 2147483647
using namespace std;
int n,m,rnum,dis[3001],first[3001],save[3001],protect[3001][3001],pronum[3001];
bool vis[3001];
struct city{
int num;
bool operator <(const city x)const{
return dis[num]>dis[x.num];
}
};
priority_queue<city>heap;
struct road{
int to,next,len;
}r[70001];
void link(int from,int to,int len){
r[++rnum]=(road){to,first[from],len};
first[from]=rnum;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int from,to,len;
scanf("%d %d %d",&from,&to,&len);
link(from,to,len);
}
for(int i=1;i<=n;i++){
scanf("%d",&save[i]);
dis[i]=(i==1?0:bigg);
for(int j=1;j<=save[i];j++){
int pro;
scanf("%d",&pro);
protect[pro][++pronum[pro]]=i;
}
}
heap.push((city){1});
while(!heap.empty()){
city top=heap.top();
heap.pop();
if(vis[top.num]){
continue;
}
vis[top.num]=true;
for(int i=first[top.num];i!=0;i=r[i].next){
if(dis[top.num]+r[i].len<dis[r[i].to]){
dis[r[i].to]=dis[top.num]+r[i].len;
if(save[r[i].to]==0){
heap.push((city){r[i].to});
}
}
}
for(int i=0;i<=pronum[top.num];i++){
save[protect[top.num][i]]--;
dis[protect[top.num][i]]=max(dis[protect[top.num][i]],dis[top.num]);
if(save[protect[top.num][i]]==0){
heap.push((city){protect[top.num][i]});
}
}
}
printf("%d",dis[n]);
return 0;
}