#include <bits/stdc++.h>
using namespace std;
const int INPUT_MAXCHARS = 1 << 16;
char buffer[INPUT_MAXCHARS];
struct FastReader {
  char *p;
  FastReader() {
    fread(buffer, 1, sizeof buffer, stdin);
    p = buffer;
  }
  int next() {
    int remchars = INPUT_MAXCHARS - (p - buffer);
    if (remchars < 25) {
      memcpy(buffer, p, remchars);
      size_t cnt = fread(buffer + remchars, 1, sizeof buffer - remchars, stdin);
      if (remchars + cnt < sizeof buffer) {
        buffer[remchars + cnt] = 0;
      }
      p = buffer;
    }
    while (*p < '0') {
      ++p;
    }
    int val = 0;
    while (*p >= '0') {
      val = val * 10 + (*p - '0');
      ++p;
    }
    return val;
  }
};
const int inf = 1234567890;
const int MAXN = 100000;
vector<int> arrivals[MAXN];
int arr_idx[MAXN];
vector<pair<int, int> > adj[MAXN];
int best[MAXN];
bool done[MAXN];
int main() {
  FastReader reader;
  int n = reader.next();
  int m = reader.next();
  for (int i = 0; i < m; ++i) {
    int a = reader.next();
    int b = reader.next();
    int c = reader.next();
    adj[a - 1].push_back(make_pair(b - 1, c));
    adj[b - 1].push_back(make_pair(a - 1, c));
  }
  for (int i = 0; i < n; ++i) {
    int k = reader.next();
    arrivals[i].reserve(k + 1);
    for (int j = 0; j < k; ++j) {
      int t = reader.next();
      arrivals[i].push_back(t);
    }
    arrivals[i].push_back(inf);
  }
  for (int i = 0; i < n; ++i) {
    best[i] = inf;
  }
  priority_queue<pair<int, int> > PQ;
  PQ.push(make_pair(0, 0));
  best[0] = 0;
  while (!PQ.empty()) {
    const pair<int, int> tmp = PQ.top();
    PQ.pop();
    int t = -tmp.first;
    int at = tmp.second;
    if (done[at] || best[at] < t) {
      continue;
    }
    done[at] = true;
    if (at == n - 1) {
      printf("%d\n", t);
      return 0;
    }
    while (arrivals[at][arr_idx[at]] < t) {
      ++arr_idx[at];
    }
    if (arrivals[at][arr_idx[at]] == t) {
      done[at] = false;
      best[at] = t + 1;
      PQ.push(make_pair(-t - 1, at));
    } else {
      for (int i = 0; i < (int)adj[at].size(); ++i) {
        const pair<int, int> e = adj[at][i];
        if (t + e.second < best[e.first]) {
          best[e.first] = t + e.second;
          PQ.push(make_pair(-best[e.first], e.first));
        }
      }
    }
  }
  puts("-1");
  return 0;
}
