#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,par[MAXN],orz[MAXN];
vector<int> rev[MAXN];
bool ok;
int find(int x){
return x==par[x]?x:par[x]=find(par[x]);
}
void join(int a,int b){
a=find(a),b=find(b);
if(a==b) return;
par[b]=a;
}
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);
while(!fila.empty()){
auto i=fila.front(); fila.pop();
vector<int> ncd;
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(sz(cand)==0) 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]=-1,par[i]=i,orz[i]=-1;
bool da=1;
fall(i,1,m){
int a,b; cin>>a>>b;
if(find(a)==find(b)){
da=0;
}
if(!da) continue;
pai[a]=b; rev[b].pb(a); orz[a]=b;
join(a,b);
}
fall(i,1,k){
int a,b; cin>>a>>b;
mp[a][b]=1;
}
if(!da){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1){
if(pai[i]==-1) bfs(i);
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";
}