#include<cstdio>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
 
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1001001001
#define LLINF 1001001001001001001
#define mp make_pair
#define LLIandI pair<long long int , int>
#define ll long long


//第六回課題
//問題:いけるかな？(Can I go there?) http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2107&lang=jp
//ソースコード:
// 左＊前
//

int main(){
    while(1){
        int N,M;
        long long int Z;
        scanf("%d %d %lld",&N,&M,&Z);
        if(M==0&&N==0&&Z==0)break;
        long long int Matrix[110][110];//辺iから辺jへの遷移可能性を表す行列,M*2 
        long long int Matrix_[110][110];
        long long int Matrix__[35][110][110];
        rep(i,M*2){
            rep(j,M*2){
                Matrix[i][j]=0;
                Matrix_[i][j]=0;
                rep(k,35){
                    Matrix__[k][i][j]=0;
                }
            }
        }
        int s[110];
        int d[110];//辺を表す
        vector<int> edges[55];//駅iを始点とする経路番号を表す
        vector<int> edged[55];//駅iを終点とする経路番号を表す
        int x[110];//最初は駅0にいるので、0を始点とする経路を1にしたベクトルを使う.
        int y[110];//最後は駅N-1に行きたいので、N-1を終点とする経路に1であるものがあれば良い。
        rep(i,55){edges[i].clear();edged[i].clear();}
        rep(i,M*2){
            x[i]=0;y[i]=0;
            s[i]=0;d[i]=0;
        }
        rep(i,M){
            scanf("%d %d",&s[i*2],&d[i*2]);
            s[i*2]--;d[i*2]--;
            s[i*2+1]=d[i*2];d[i*2+1]=s[i*2];
            edges[s[i*2]].push_back(i*2);
            edged[d[i*2]].push_back(i*2);
            edges[s[i*2+1]].push_back(i*2+1);
            edged[d[i*2+1]].push_back(i*2+1);
        }
        rep(i,N){//駅iについて
            rep(j,edged[i].size()){
                //駅iに到着する経路numについて
                int num=edged[i][j];
                rep(k,edges[i].size()){//駅いを始点とする経路num2に対して
                    int num2=edges[i][k];
                    if(d[num2]==s[num])continue;//iの前にいた駅に戻ってしまう辺には遷移できない
                    Matrix[num][num2]=1;//経路num->経路num2の順で遷移出来る
                }
            }
        }
        
        rep(i,edges[0].size()){
            x[edges[0][i]]=1;
        }
        //MをZ乗する(計算量)
        //Z=2>>10;
        if(Z==1){
            rep(i,M*2){y[i]=x[i];}
        }else{
            if(Z==2){
                rep(i,M*2)rep(j,M*2)Matrix_[i][j]=Matrix[i][j];
            }else{
                
                for(int i=0; i<M*2; i++){
                        for(int j=0; j<M*2; j++) {
                            for(int k=0; k<M*2; k++) {
                                Matrix_[i][j] += Matrix[k][j]*Matrix[i][k];
                                Matrix__[1][i][j] += Matrix[k][j]*Matrix[i][k];
                                if(Matrix_[i][j]>10)Matrix_[i][j]=1;
                            }
                        }
                }
                //
                //printf("%lld",(Z==999999999));
                //Z=999999999;
                long long int r=Z-1;
                long long int now=2;
                int nanjyou=1;
                while(1){
                    if(r==now)break;
                    if(r>=now*2){
                        nanjyou++;
                        for(int i=0; i<M*2; i++) {
                            for(int j=0; j<M*2; j++) {
                                for(int k=0; k<M*2; k++) {
                                    Matrix__[nanjyou][i][j] += Matrix_[k][j]*Matrix_[i][k];
                                }
                            }
                        }
                        now=1<<nanjyou;
                    }else if(r-now>=2){
                        int nokorinanjyo=int(log2(r-now));//printf("!%d!",nokorinanjyo);
                        nanjyou=0;
                        for(int i=0; i<M*2; i++) {
                            for(int j=0; j<M*2; j++) {
                                for(int k=0; k<M*2; k++) {
                                    Matrix__[nanjyou][i][j] += Matrix__[nokorinanjyo][k][j]*Matrix_[i][k];
                                }
                            }
                        }
                        now+=1<<nokorinanjyo;//printf("!%d!",1<<nokorinanjyo);
                    }else{
                        nanjyou=0;
                        for(int i=0; i<M*2; i++) {
                            for(int j=0; j<M*2; j++) {
                                for(int k=0; k<M*2; k++) {
                                    //Matrix__[nanjyou][i][j] += Matrix[k][j]*Matrix_[i][k];
                                    Matrix__[nanjyou][i][j] += Matrix[k][j]*Matrix_[i][k];
                                }
                            }
                        }
                        now+=1;
                    }
                    rep(i,M*2)rep(j,M*2){
                        if(Matrix__[nanjyou][i][j]>10)Matrix__[nanjyou][i][j]-=10;
                        Matrix_[i][j]=Matrix__[nanjyou][i][j];
                        if(Matrix_[i][j]>10)Matrix_[i][j]=1;
                        if(nanjyou==0)Matrix__[nanjyou][i][j]=0;
                    }
                    //printf("%lld--%d,",now,nanjyou);
                    
                    
                }//while
            }
            rep(i,M*2){
                rep(j,M*2){
                    y[i]+=Matrix_[j][i]*x[j];
                }
            }
        }
        
        //rep(i,N)printf("%d ",edged[i].size());
        /*printf("\n");
        rep(i,M*2)printf("%d ",x[i]);
        printf("\n");
        rep(i,M*2)printf("%d ",y[i]);
        printf("\n");
        rep(i,M*2){
                rep(j,M*2){
                    printf("%d",Matrix_[i][j]);
                }
                printf("\n");
            }
            */
        //問題に回答
        if(edged[N-1].size()==0){
            printf("no\n");
            continue;
        }
        rep(i,edged[N-1].size()){
            if(y[edged[N-1][i]]>0){
                printf("yes\n");
                break;
            }else if(i==edged[N-1].size()-1){
                printf("no\n");
            }
        }
    }
}



Measured memory_bytes: 6036