#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],root[MAXN],id[MAXN],cur,par[MAXN],obrigado[MAXN];
vector<int> rev[MAXN],cand,group[MAXN];
set<int> st;
bool ok=0;
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);
id[x]=++cur;
while(!fila.empty()){
auto i=fila.front(); fila.pop();
group[cur].pb(i);
vector<int> ncd;
for(auto u:cand){
if(u==x) continue;
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;
bool da=1;
fall(i,0,n-1) obrigado[i]=-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); obrigado[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) cand.pb(i);
fall(i,0,n-1){
if(obrigado[i]!=-1) continue;
fall(j,0,n-1) pai[j]=obrigado[j];
cand.clear();
fall(j,0,n-1) if(pai[j]==-1) cand.pb(j);
bfs(i);
if(ok) break;
}
if(!ok){
cout<<"NO\n";
return 0;
}
fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";
}