#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod=1e9+7;

int main() {
    int N, D;
    cin >> N >> D;
    vector<double> l;
    for(int i=0; i<N; i++){
        for(int j=0; j<D; j++){
            int in;
            cin >> in;
            l.push_back(in);
        }
    }

    if(D==1){
        int cnt=0;
        for(int i=0; i<N; i++){
            double num;
            for(int j=i+1; j<N; j++){
                num = sqrt(pow(l[i]-l[i+j],2));
                if(ceil(num)==floor(num)) cnt++;
            }
        }
        cout << cnt;
        return 0;
    }

    double x, y;
    int cnt=0;
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*2], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*3], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*4], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*5], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*6], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*7], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*8], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*9], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    for(int i=0; i<N; i++){
        vector<double> num;
        for(int j=0; j<D; j++){
            x=pow(l[j+D*i]-l[j+D*i+D*10], 2);
            num.push_back(x);
        }
        y=sqrt(accumulate(num.begin(), num.end(),0));
        if(ceil(y)==floor(y)) cnt++;
    }
    
    cout << cnt;
}

Measured memory_bytes: 256