#include <iostream>
#include <fstream>
#include <cassert>
#include <typeinfo>
#include <vector>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <iomanip>
#include <cctype>
#include <random>
#include <complex>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<P,int> pip;
typedef vector<pip> vip;
const int inf=1<<29;
const ll INF=1ll<<58;
const double pi=acos(-1);
const double eps=1e-7;
const ll mod=1e9+7;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

class Network{
	private:
	int V;
	struct edge{
		int to,cap,rev;
	};
	vector<vector<edge> > g;
	map<P,int> m;
	int DFS(int v,int t,int f,vi& used){
		if(v==t) return f;
		used[v]=1;
		for(int i=0;i<g[v].size();i++){
			edge &e=g[v][i];
			if(!used[e.to]&&e.cap>0){
				int d=DFS(e.to,t,min(f,e.cap),used);
				if(d>0){
	//				if(t==11) cout<<'A'<<e.to<<endl;
					e.cap-=d;
					g[e.to][e.rev].cap+=d;
					return d;
				}
			}
		}
		return 0;
	}
	public:
	Network(int v){
		V=v;
		g=vector<vector<edge> >(v);
	}
	void add_edge(int s,int t){
		m[{s,t}]=g[s].size();
		g[s].push_back(edge{t,1,(int)g[t].size()});
		g[t].push_back(edge{s,1,(int)g[s].size()-1});
	}
	int Max_Flow(int s,int t){
		int ans=0;
		while(1){
			vi used(V);
			int f=DFS(s,t,1,used);
			if(f==0) return ans;
			ans+=f;
		}
	}
	int Add(int u,int v){
		add_edge(u,v);
		vi used(V);
		return DFS(0,V-1,inf,used);
	}
	int Erase(int u,int v,int ind){
		int I=m[{u,v}],J=g[u][I].rev,C=g[u][I].cap;
//		if(ind==817) cout<<C<<endl;
//		if(ind==816) cout<<g[1][m[{1,3}]].cap<<endl;
		if(C==1){
			g[u][I].cap=0;
			g[v][J].cap=0;
			return 0;
		}
		vi used(V);
		int f=DFS((C?v:u),(C?u:v),1,used);
		if(f){
			g[u][I].cap=0;
			g[v][J].cap=0;
			return 0;
		}
		used=vi(V);
		DFS(V-1,0,1,used);
		g[u][I].cap=0;
		g[v][J].cap=0;
		used=vi(V);
		DFS((C?v:u),(C?u:v),1,used);
//		cout<<"!!!!!"<<f<<endl;
		return 1;
	}
	void Open(){
		for(int i=0;i<V;i++){
			for(int j=0;j<g[i].size();j++) if(g[i][j].cap==2) cout<<g[i][j].to<<' '<<i<<endl;
		}
	}
};

int n,m,q;

int main(){
	cin>>n>>m>>q;
	Network nt(n);
	vvi g(n,vi(n));
	for(int i=0;i<m;i++){
		int u,v;
		cin>>u>>v;
		u--;v--;
		if(u>v) swap(u,v);
		nt.add_edge(u,v);
		g[u][v]++;
		g[v][u]++;
	}
	vi a(q);
	int res=nt.Max_Flow(0,n-1);
	for(int i=0;i<q;i++){
		int t,u,v;
		cin>>t>>u>>v;
		u--;v--;
		if(u>v) swap(u,v);
		if(t==1){
			res+=nt.Add(u,v);
			g[u][v]++;
			g[v][u]++;
		}
		else{
			res-=nt.Erase(u,v,i);
			g[u][v]--;
			g[v][u]--;
		}
		a[i]=res;
		cout<<res<<endl;
/*		if(i==1){
			cout<<u<<' '<<v<<endl;
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++) cout<<g[j][k]<<' ';
				cout<<endl;
			}
			nt.Open();
			cout<<res<<endl;
		}*/
	}
/*	for(int i=0;i<q;i++){
		int x;
		cin>>x;
		if(a[i]!=x){
			cout<<i<<endl;
			cout<<x<<' '<<a[i]<<endl;
			break;
		}
	}*/
}

Measured memory_bytes: 5824