#include<bits/stdc++.h>
using namespace std;
#define int long long
#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],vs[MAXN];
vector<int> rev[MAXN];
bool ok;
void bfs(int x){
queue<int> fila; fila.push(x);
vector<int> cand;
fall(i,0,n-1) if(pai[i]==-1 && i!=x) cand.pb(i);
int vis=0;
while(!fila.empty()){
auto i=fila.front(); fila.pop();
vs[i]=1;
vector<int> ncd;
++vis;
for(auto u:cand){
if(mp[u][i]) ncd.pb(u);
else{
pai[u]=i;
fila.push(u);
}
}
for(auto u:rev[i]) fila.push(u);
cand=ncd;
}
if(vis==n) ok=1;
}
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[a][b]=1;
}
fall(i,0,n-1){
if(pai[i]==-1 && !vs[i]) bfs(i);
else continue;
if(ok) break;
fall(j,0,n-1) pai[i]=orz[i];
}
if(!ok){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";
}