#include<bits/stdc++.h>
using namespace std;
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=3e5+10;
const int inf=1e16;
map<int,bool> mp[MAXN];
int n,m,k,pai[MAXN],cur,orz[MAXN];
vector<int> rev[MAXN],cand;
bool ok,mark[MAXN];
void bfs(int x){
cand.clear();
fall(i,0,n-1) if(i!=x && pai[i]==-1) cand.pb(i);
queue<int> fila; int vs=0; fila.push(x);
while(!fila.empty()){
auto i=fila.front(); fila.pop();
vs++;
vector<int> ncd;
for(auto u:cand){
if(!mp[i][u]){
pai[u]=i;
fila.push(u);
}
else ncd.pb(u);
}
for(auto u:rev[i]) fila.push(u);
cand=ncd;
}
ok=(vs==n);
}
void find_SCC(int x){
queue<int> fila; fila.push(x);
vector<int> reach;
while(!fila.empty()){
auto i=fila.front(); fila.pop();
reach.pb(i);
vector<int> nd;
for(auto u:cand){
if(!mp[i][u]) fila.push(u);
else nd.pb(u);
}
cand=nd;
}
vector<int> scc;
vector<int> ncand;
for(auto u:reach){
if(!mp[u][x]) fila.push(u);
else ncand.pb(u);
}
while(!fila.empty()){
auto a=fila.front(); fila.pop();
scc.pb(a);
vector<int> nc;
for(auto u:ncand){
if(!mp[u][a]) fila.push(u);
else nc.pb(u);
}
ncand=nc;
}
int strong=-1;
for(auto a:scc){
if(strong!=-1) break;
for(auto u:cand){
if(!mp[u][a]){
strong=u;
break;
}
}
}
if(strong!=-1) find_SCC(strong);
else{
for(auto u:scc){
if(pai[u]==-1){
bfs(u);
break;
}
}
}
}
int32_t main(){
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m>>k;
fall(i,0,n-1) pai[i]=orz[i]=-1;
bool da=1;
fall(i,1,m){
int a,b; cin>>a>>b;
pai[a]=b; rev[b].pb(a); orz[a]=b;
}
fall(i,1,k){
int a,b; cin>>a>>b;
mp[b][a]=1;
}
fall(i,0,n-1) if(i) cand.pb(i);
find_SCC(0);
if(!ok){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";
}