boolspfa( int V ){ queue<int> q; for( int i = 0; i < V; ++ i ) { dis[i] = 0, cnt[i] = 0, inq[i] = 1; q.push( i ); } while( !q.empty( ) ) { int u = q.front( ); q.pop( ); inq[u] = false; for( auto [v, w] : adj[u] ) { if( dis[u] == inf ) continue; if( dis[u] + w < dis[v] ) { dis[v] = dis[u] + w; cnt[v] = cnt[u] + 1; if( cnt[v] >= V ) returntrue; if( !inq[v] ) inq[v] = true, q.push( v ); } } } returnfalse; }
structAllEdge { int o, a, b, k; }; vector<AllEdge> edges;
boolcheck( int N, double T ){ for( int i = 0; i <= N; ++ i ) adj[i] = base[i]; for( auto [o, a, b, k] : edges ) { if( o == 1 ) { if( k - T <= 0 ) continue; adj[a].push_back({ b, -log10( k - T ) }); } else { adj[a].push_back({ b, log10( k + T ) }); } } returnspfa( N + 1 ); }
voidsolve( ){ int n = read( ), s = read( ), t = read( );
for( int i = 1; i <= s; ++ i ) { int o = read( ), a = read( ), b = read( ), k = read( ); edges.push_back({ o, a, b, k }); }
for( int i = 1; i <= t; ++ i ) { int c = read( ), xi = read( ); base[0].push_back({ c, log10( xi ) }); base[c].push_back({ 0, -log10( xi ) }); }
double l = 0, r = 1e9, ans = -1; for( int t = 1; t <= 100; ++ t ) { double mid = ( l + r ) / 2.0; if( check( n, mid ) ) ans = mid, l = mid; else r = mid; } cout << fixed << setprecision( 10 ) << ans << '\n'; }