#include #include #include #include #include #include #define M 1007 using namespace std; int n,m,cap,s,e,num; int val[M],dp[M][M],head[M]; struct node { int u,cost,res; bool operator < (const node a)const { return cost>a.cost; } }; struct E { int v,to,dist; } edg[M*20]; vectorG[M]; void addedge(int u,int v,int dist) { edg[num].v=v; edg[num].dist=dist; edg[num].to=head[u]; head[u]=num++; } void init() { num=0; memset(head,-1,sizeof(head)); memset(val,0,sizeof(val)); for(int i=0; i q; q.push((node){s,0,0}); while(!q.empty()) { node x=q.top(); q.pop(); int u=x.u,cost=x.cost,res=x.res; if(u==e) { printf("%d\n",cost); return ; } if(rescost+val[u])) { dp[u][res+1]=cost+val[u]; q.push((node){u,dp[u][res+1],res+1}); } for(int i=head[u]; i!=-1; i=edg[i].to) { int v=edg[i].v,dist=edg[i].dist; if(rescost) { dp[v][res-dist]=cost; q.push((node){v,cost,res-dist}); } } } printf("impossible\n"); return ; } int main() { while( scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=0; i