/* Rozwiazanie wzorcowe do zadania CYK (Cykl)
 * Autor: Jakub Radoszewski
 * Data: 18.02.2010
 */

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;


/* Struktura danych dla zbiorow rozlacznych.
 * Zlozonosc: O(n log*n) */

#define MAX_N 500001
int p[MAX_N],rank[MAX_N];

inline void makeset(int x)
{
  p[x]=x; rank[x]=0;
}

int findset(int x)
{
  if (x!=p[x]) p[x]=findset(p[x]);
  return p[x];
}

inline void link(int x,int y)
{
  if (rank[x]>rank[y]) p[y]=x;
  else
  {
    p[x]=y;
    if (rank[x]==rank[y]) rank[y]++;
  }
}

inline void unia(int x,int y)
{
  link(findset(x),findset(y));
}

int n,m,k;

int main()
{
  scanf("%d%d%d",&n,&m,&k);
  for (int i=0; i<n; i++) makeset(i);

  int cykle=0;
  while (m--)
  {
    int a,b;
    scanf("%d%d",&a,&b);
    a--; b--;
    if (findset(a)!=findset(b)) unia(a,b); else cykle++;
  }
  if (cykle>1) { puts("-1"); return 0; }

  int wyn=0;
  while (k--)
  {
    int a,b;
    scanf("%d%d",&a,&b);
    a--; b--;
    if (findset(a)!=findset(b))
    {
      unia(a,b);
      wyn++;
    } else
    {
      if (cykle==0) { cykle=1; wyn++; }
    }
  }
  if (cykle==0) { puts("-1"); return 0; }
  printf("%d\n",wyn);
  return 0;
}
