/**************************************************************
    Problem: 2095
    User: zrts
    Language: C++
    Result: Accepted
    Time:144 ms
    Memory:984 kb
****************************************************************/
 
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<queue>
//  by zrt
//  problem:
//  无论你在什么时候开始，重要的是开始以后就不要停止。
using namespace std ;
typedef long long ll ;
const double eps(1e-10) ;
const int inf(0x3fffffff) ;
int n,m;
#define MAX_N 1050
#define MAX_M 2050
int H[MAX_N],X[MAX_M*2],P[MAX_M*2],E[MAX_M*2],tot;
bool vis[MAX_M*2];
int ind[MAX_N],outd[MAX_N];
int minn,maxx;
inline void add(int x,int y,int z){
    P[++tot]=y;X[tot]=H[x];H[x]=tot;E[tot]=z;
}
int _H[MAX_N],_X[MAX_M*3],_P[MAX_M*3],flow[MAX_M*3],_tot;
inline void _add(int x,int y,int z){
    _P[++_tot]=y;_X[_tot]=_H[x];_H[x]=_tot,flow[_tot]=z;
}
int S,T;
queue<int> q;
int d[MAX_N];
bool bfs(){
    memset(d,0,sizeof d);
    d[S]=1;
    q.push(S);int k;
    while(!q.empty()){
        k=q.front();q.pop();
        for(int i=_H[k];i;i=_X[i]){
            if(flow[i]>0&&!d[_P[i]]){
                d[_P[i]]=d[k]+1;
                q.push(_P[i]);
            }
        }
    }
    return d[T];
}
int dfs(int x,int a){
    if(x==T||a==0) return a;
    int f=a,tmp;
    for(int i=_H[x];i&&a;i=_X[i]){
        if(flow[i]>0&&d[x]+1==d[_P[i]]){
            tmp=dfs(_P[i],min(a,flow[i]));
            flow[i]-=tmp;
            flow[i^1]+=tmp;
            a-=tmp;
        }
    }
    if(f==a) d[x]=-1;
    return f-a;
}
int dinic(){
    int maxflow(0);
    while(bfs()) maxflow+=dfs(S,inf);
    return maxflow;
}
bool judge(int limit){
    memset(ind,0,sizeof ind);memset(outd,0,sizeof outd);memset(vis,0,sizeof vis);_tot=1;
    memset(_H,0,sizeof _H);
    for(int i=1;i<=n;i++){
        for(int j=H[i];j;j=X[j]){
            if(E[j]>limit&&E[j^1]>limit) return false;
            if(!vis[j]&&!vis[j^1]&&E[j]<=limit){
                vis[j]=1;
                outd[i]++;ind[P[j]]++;
            }
        }
    }
    int fs(0);
    for(int i=1;i<=n;i++){
        if((outd[i]-ind[i])&1) return false;
        if(ind[i]>outd[i]){
            fs+=(ind[i]-outd[i])>>1;
            _add(S,i,(ind[i]-outd[i])>>1);
            _add(i,S,0);
        }else if(ind[i]!=outd[i]){
            _add(i,T,(outd[i]-ind[i])>>1);
            _add(T,i,0);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=H[i];j;j=X[j]){
            if(!vis[j]&&E[j]<=limit){
                _add(i,P[j],1);
                _add(P[j],i,0);
            }
        }
    }
    if(dinic()!=fs) return false ;
    else return true;
}
int main(){
    #ifdef LOCAL
    freopen("in.txt","r",stdin) ;
    freopen("out.txt","w",stdout) ;
    #endif
    scanf("%d%d",&n,&m);
    S=n+1,T=n+2;
    tot=1;
    minn=inf,maxx=-inf;
    for(int i=0,a,b,c,d;i<m;i++){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        minn=min(minn,min(c,d));
        maxx=max(maxx,max(c,d));
        add(a,b,c);add(b,a,d);
    }
    int l=minn-1,r=maxx;
    if(!judge(r)) printf("NIE");
    else{
        int m;
        while(r-l>1){
            m=(l+r)>>1;
            if(judge(m)){
                r=m;
            }else l=m;
        }
        printf("%d\n",r);
    }
    return 0 ;
}