题目传送门
  
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define inf 0x3fffffff
int maze[110][110];
int dis[110],degree[110],val[110],vis[110];
int m,n;
void init()
{
    memset(dis,inf,sizeof(dis));
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
          maze[i][j]=inf;
}
int dij()
{
    for(int i=1;i<=n;i++)
        dis[i]=val[i];
    for(int i=1;i<=n;i++)
    {
        int minn=inf,mark=inf;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<minn)
            {
                minn=dis[j];
                mark=j;
            }
        }
        if(minn==inf)break;
        vis[mark]=true;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]>dis[mark]+maze[mark][j])
            {
                dis[j]=dis[mark]+maze[mark][j];
            }
        }
    }
    return dis[1];
}
int main()
{
    while(~scanf("%d%d",&m,&n))
    {
        init();
        int x,a,b,tmp;
        int ans=inf;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&val[i],°ree[i],&x);
            while(x--)
            {
                scanf("%d%d",&a,&b);
                maze[a][i]=b;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(degree[j]>=degree[i]&°ree[j]<=degree[i]+m)
                {
                    vis[j]=false;
                }
                else
                {
                    vis[j]=true;
                }
            }
            tmp=dij();
            ans=min(ans,tmp);
        }
        cout<<ans<<endl;
    }
    return 0;
}