//308K
79MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#define VM 1005
#define EM 10010
using namespace std;
const int inf = 0x3f3f3f3f;
int head[VM],cnt[VM][2],dist[VM][2],vis[VM][2];
int e,src,des,n,m;
struct E
{
to,w,nxt;
} edge[EM];
void addedge (int cu,int cv,int cw)
{
cv;
cw;
= head[cu];
++;
}
int dij ()
{
i,j,u,min,flag;
(dist,0x3f,sizeof(dist));
(vis,0,sizeof(vis));
(cnt,0,sizeof(cnt));
= 0;
= 1;
i < 2*n; i ++)
min = inf;
for (j = 1; j <= n; j ++)
if (!vis[j][0]&&dist[j][0]
< min)
{
u = j;
flag = 0;
min = dist[j][0];
}
else if (!vis[j][1]&&dist[j][1]
< min)
{
u = j;
flag = 1;
min = dist[j][1];
}
if (min == inf)
break;
vis[u][flag] = 1;
for (j = head[u]; j != -1; j = edge[j].nxt)