#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
#include<unordered_map> 
// #pragma comment(linker, "/stack:200000000")
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll int
// #define INT_MAX 5000000
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define si short int
#define INTMAX 1000000000
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
// #define INTMAX 1000001000
#define pii pair<ll,ll> 
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 700010
#define lgn 20
#define ddouble long double
#define minus minu
#define lgn 20

// #define INTMAX 200000000  
// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;             
typedef priority_queue<ll, vector<ll > > max_pq;
// typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// using namespace __gnu_pbds;         
// typedef priority_queue<pair<ll,char> , vector<pair<ll , char> > > max_pq;
// typedef priority_queue<pii , vector<pii > ,greater<pii > > min_pq;
typedef tree<ll , null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> OST;
// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
    cout << name << " : " << arg1 << std::endl;
    //use cerr if u want to display at the bottom
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
    const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif
ll ar[ 555 ][ 555 ];
int main()
{
    ios::sync_with_stdio(false);
    // cin.tie(NULL);
    // #ifndef ONLINE_JUDGE
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
    // #endif  
    ll nn,m;
    cin >> nn >> m;
    for ( ll i = 1; i <= nn; i++)
    {
        for ( ll j = 1; j <= m; j ++)
            cin >> ar[i][j];
    }
    vector < pair<pii,pii>  > ans;
    for ( ll i = 1; i <= nn; i ++)
    {
        vector < ll > odds;
        for ( ll j = 1; j <= m; j ++)
        {
            if ( ar[i][j]%2 )
                odds.pb(j);
        }
        ll n = (ll)odds.size()-(ll)(odds.size()%2);
        ll pos = 0;
        while ( pos < n )
        {
            for ( ll k = odds[pos]; k < odds[pos+1]; k ++)
            {
                ans.pb(mp(mp(i,k),mp(i,k+1)));
            }
            pos += 2;
        }
        if ( odds.size()%2 )
        {
            if ( i != nn )
            {
                ans.pb(mp(mp(i,odds[odds.size()-1]),mp(i+1,odds[odds.size()-1])));
                ar[i+1][odds[odds.size()-1]]++; 
            }
        }
    }
    cout << ans.size() << endl;
    for ( auto it : ans )
    {
        cout << it.fi.fi << " " << it.fi.sec <<" ";
        cout << it.sec.fi << " " << it.sec.sec;
        cout << endl;
    }

    
}



Measured memory_bytes: 5228