#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,s,t,c[N],f[N];
double dis[N];
bool vis[N];
struct node{
int op,x,y,k;
}a[N];
vector<pair<int,double> > g[N];
void add(int x,int y,double z){
g[x].push_back({y,z>0? log(z):-log(-z)});
}
bool check(double t){
for(int i=0;i<=n;i++)
g[i].clear();
for(int i=1;i<=n;i++)
if(c[i]) add(0,i,c[i]),add(i,0,-c[i]);
for(int i=1;i<=s;i++){
int op=a[i].op,x=a[i].x,y=a[i].y,k=a[i].k;
if(c[x]&&c[y]&&((op==1&&c[x]<c[y]*(k-t))||(op==2&&c[x]*(k+t)<c[y]))) return true;
if(op==1) add(x,y,t-k);
if(op==2) add(x,y,k+t);
}
memset(f,0,sizeof(f));
memset(vis,false,sizeof(vis));
fill(dis+1,dis+n+1,1e18);
queue<int> q;
vis[0]=true,dis[0]=0;
q.push(0);
while(!q.empty()){
int x=q.front(); q.pop();
vis[x]=false;
for(int i=0;i<g[x].size();i++){
int y=g[x][i].first; double z=g[x][i].second;
if(dis[y]>dis[x]+z){
dis[y]=dis[x]+z;
f[y]=f[x]+1;
if(f[y]>n+1) return true;
if(!vis[y]){
vis[y]=true;
q.push(y);
}
}
}
}
return false;
}
int main(){
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=s;i++)
scanf("%d%d%d%d",&a[i].op,&a[i].x,&a[i].y,&a[i].k);
for(int i=1;i<=t;i++){
int x,y; scanf("%d%d",&x,&y);
c[x]=y;
}
double l=0,r=1e9,mid=0; bool ok=false;
while(r-l>1e-6){
mid=(l+r)/2;
if(check(mid)) l=mid,ok=true;
else r=mid;
}
ok? printf("%lf",l):puts("-1");
return 0;
}