#include<bits/stdc++.h>
using namespace std;
const int N=1005;
const double EPS=1e-12;
int n,m,k,head[N],tot,vis[N];
double l=0,r=11,mid,ans=-1,c[N],cnt[N],dis[N];
struct Edge{
int nxt,tar;
double w;
Edge(int nxt=0,int tar=0,double w=0):nxt(nxt),tar(tar),w(w){}
}edge[N<<1];
struct Graph{
int op,u,v;
double w;
Graph(int op=0,int u=0,int v=0,double w=0):op(op),u(u),v(v),w(w){}
}g[N<<1];
void add(int u,int v,double w){
edge[++tot]=Edge(head[u],v,w),head[u]=tot;
return;
}
bool spfa(double t){
queue<int>q;
memset(cnt,0,sizeof(cnt)),memset(vis,0,sizeof(vis)),memset(head,0,sizeof(head));
tot=0;
for(int i=1;i<=m;i++){
if(g[i].op==1)
add(g[i].v,g[i].u,g[i].w-t);
else
add(g[i].v,g[i].u,1.0/(g[i].w+t));
}
for(int i=1;i<=n;i++)
if(c[i])
add(0,i,c[i]),add(i,0,1.0/c[i]);
for(int i=0;i<=n;i++){
dis[i]=vis[i]=cnt[i]=1;
q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u],v,w;i;i=edge[i].nxt){
v=edge[i].tar,w=edge[i].w;
if(dis[v]<dis[u]*w){
dis[v]=dis[u]*w;
if(!vis[v]){
vis[v]=1;
q.push(v);
if((++cnt[v])>n+1)
return 0;
}
}
}
vis[u]=0;
}
return 1;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1,op,u,v;i<=m;i++){
double w;
scanf("%d%d%d%lf",&op,&u,&v,&w);
if(op==1)
r=fmin(r,w);
g[i]=Graph{op,u,v,w};
}
for(int i=1,id;i<=k;i++){
double x;
scanf("%d%lf",&id,&x);
c[id]=x;
}
while(l+EPS<r){
mid=(l+r)/2;
if(spfa(mid))
r=mid;
else
ans=l=mid;
}
if(ans==-1)
printf("-1");
else
printf("%.10lf",ans);
return 0;
}
不知道为啥全是 -1。