#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <climits>
int L[200010];
using namespace std;
int MAXN=70000;
int p[70000];
bool inq[70000];
long long d[200010];
int INF=0x3f3f3f3f;
int eid;
int n,m;
struct edge {
int v;
int next;
int w;
} e[500000];
int edgeinsert(int wei,int u,int v) {
e[eid].v=v;
e[eid].w=wei;
e[eid].next=p[u];
p[u]=eid++;
}
int init() {
memset(p,-1,sizeof(p));
eid=0;
}
void SPFA(int st,int level) {
memset(inq,false,sizeof(inq));
memset(d,INF,sizeof(d));
d[st]=0;
inq[st]=true;
queue<int>q;
q.push(st);
while(!q.empty()) {
int u=q.front();
q.pop();
inq[u]=false;
for(int i=p[u]; i!=-1; i=e[i].next) {
int v=e[i].v;
if((L[v] >= level)&&(L[v] <= level+m)&&(d[u]+e[i].w<d[v])) { //只能和>=自己等级的精灵交易
d[v]=d[u]+e[i].w;
if(!inq[v]) {
q.push(v);
inq[v]=true;
}
}
}
}
return;
}
int main() {
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(false);
init();
cin>>m>>n;
for(int i=1; i<=n; i++) {
int p,x;
cin>>p>>L[i]>>x;
edgeinsert(p,0,i);
while(x--) {
int a,b;
cin>>a>>b;
edgeinsert(b,a,i);
}
}
long long ans=INF;
for(int level = L[1] - m; level <= L[1]; level++) { //蘑菇精的修为可以比成仙小M
SPFA(0,level);
ans=min(d[1],ans);
}
cout<<ans;
return 0;
}