#include #include #include #include #include using namespace std; struct State { int price, to; State( int p, int t ) : price(p), to(t) {} bool operator<( const State& s ) const { if( price == s.price ) return to < s.to; return price > s.price; } }; int N, M, K; vector v[10000]; void input() { scanf("%d %d %d", &N, &M, &K); int x, y; for( int i = 0; i < M; i++ ) { scanf("%d %d", &x, &y); v[x].push_back(State(0, y)); v[y].push_back(State(0, x)); } for( int i = 0; i < K; i++ ) { scanf("%d %d", &x, &y); v[x].push_back(State(1, y)); v[y].push_back(State(1, x)); } } int dist[10000]; void dijkstra( int start ) { bool used[10000] = {0}; used[start] = 1; priority_queue pq; memset(dist, 63, sizeof(dist)); for( int i = 0; i < v[start].size(); i++ ) { dist[v[start][i].to] = v[start][i].price; pq.push(v[start][i]); } while( !pq.empty() ) { int vertex = pq.top().to; pq.pop(); if( used[vertex] ) continue; used[vertex] = 1; for( int i = 0; i < v[vertex].size(); i++ ) if( !used[v[vertex][i].to] && dist[vertex] + v[vertex][i].price < dist[v[vertex][i].to] ) { dist[v[vertex][i].to] = dist[vertex] + v[vertex][i].price; pq.push(State(dist[v[vertex][i].to], v[vertex][i].to)); } } } int main() { input(); dijkstra(N-1); int ans = dist[0]; if( dist[0] >= N ) ans = 0; if( ans == 0 ) printf("-1\n"); else printf("%d\n", ans); return 0; }